import from redhat cvs
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
Binary files differ
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 df<EC1FF891B57E010314E0010F14F84980017F8090B7FC48D9F80F1380DA
+C00113C048496C13E04848C7123F4848EC1FF049140F484815F81607484815FCA2484814
+03A24915FEA200FF1501A290B7FCA517FCA290CAFC7FA2127FA27F123F6D15FCA26C6CEC
+01FE7F6C6C14036C6C14076DEC0FFC6C6D131F6C01E0EB7FF86C9039FC03FFF06DB612E0
+6D15C06D158001071500010114FC6D6C13E0020790C7FC2F3679B43E>101
+D<ED07FC3B3FFF803FFF804891B512E0B500C38002C78002CF806C01DF806C9038FFF80F
+D8003F9038C003FFED00014A7F4A815C177F5CA25CA35CB3A8003FB5D8C07FB51280486E
+B612C0B66C15E0A36C4A15C06C4A6C14803B347FB33E>110 D<EE07FE263FFFF890387F
+FFC0484AB512E0B5D8FC0714F05D4B14F86C5C6C91387FFC0FD80003EBFFC002FD903800
+07F0DAFFFEEB03E003F890C7FC5D5DA25D5DA292C9FCA25CA45CB3A3003FB612FC4881B7
+FCA37E6C5D35347CB33E>114 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 df<ED1FE0913801FFF8913807F01E91381F80074A485A02FEEB3F80495A5C
+4948140013074A131E93C7FCA3130F5CA5011F147C000FB612FCA339001F80031501133F
+02005BA415035B017E5CA4150713FE495CA4150F1201495CA40003141F3A7FFFC3FFFEA2
+B5FC29357EB42B>12 D<387FFFF8A4B512F015057D921A>45 D<EB07FCEB3FFF9038F80F
+C03901C003E0D803F07F6D6C7EA248486C7E12035BC8FCA21401A2EC7FF8EB07FFEB3FE1
+EBFF013803F803EA0FF0D81FE05BEA3FC01380007F1560EB000748ECE0C05A140FA2141F
+007F90383BE180EC73E33A1F81E1FF00390FFF81FE3901FE007823237CA126>97
+D<137EEA1FFE5B123F1201A2120012015BA512035BA50007137F9038E1FFC09038E781F0
+9038FE00FC01F8137E49133E4848133FED1F805BA216C0A2121F5BA4153F003F158090C7
+FCA3ED7F00A24814FE007E5C4A5A007F13035D397B8007C039F1C01F8026E0E07EC7FC38
+C07FF838001FC0223578B32B>I<ECFF80010713E090381F807890383E001C01FC137C48
+4813FE485A0007EB01FCEBE000484813F8001F1400A2485AA2127F90C8FCA45A5AA3127E
+A2007F1430A26C147015E06C6C13C0380FC0033907E007003803F03E3800FFF8EB1FC01F
+237CA122>I<167EED1FFE16FC153F1501A416F8A41503A216F0A4150714FE903907FFC7
+E090381F81E790387E007749133F4848131F4848130F484814C0120F485AA24848131FA2
+007F158090C7FCA3153F5A481500A3127E5DA2157E6C14FE14016C13036C6C487E2607C0
+0E13F03803E07C3800FFF090393F80FC0027357BB32B>I<EB03FCEB0FFF90383E0FC090
+38FC03E0D801F813F03803F001D807E013F8380FC000121F5B123F48C7FCA312FEB6FCA2
+48C8FCA35AA51560127E15E0003EEB01C0003FEB03806CEB0700380F800E3807E07C3801
+FFF038003F801D237BA122>I<163C91387F01FF903901FFE3CF903907C1FF0F90391F80
+FC1F90393F007C0E017EEB3E005B153F485AA35D157E5BA25D6D5B0000495A90387C03E0
+9038FE0FC02601CFFFC7FC380383F80180C8FCA21207A37F90B57E6C14F015FC6C804880
+380F800048C7EA3F80003E141F48140F12FC5AA3151F16006C143E007C5C6C5C6CEB03F0
+3907E01FC00001B5C7FC38003FF028337FA126>103 D<EB01F8137F5C13FF1307A21303
+13075CA5130F5CA5011F13FE913883FF8091388F07E0EC9C0302B813F014F0EB3FE014C0
+1480A2140015075B017E14E0A4150F13FE4914C0A4151F1201491480A40003143F3A7FFF
+C7FFFCA2B5FC26347EB32B>I<EB0380EB0FC0EB1FE0A314C0A2EB070090C7FCAA131FEA
+07FFA3C67EA3137EA513FE5BA512015BA512035BA41207B5FCA313337EB215>I<EB03F0
+13FF14E0A2130FA21307130F14C0A5131F1480A5133F1400A55B137EA513FE5BA512015B
+A512035BA41207B51280A2140014347EB315>108 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>I<D801F0131F007FEB07FF00
+FF5BA2000F1300000780A249137EA415FE120F495BA41401121F01805BA41403123F4948
+5AA2140F6C131F819039807FFF80380FC0E73803FFC7C6903807E000212279A02B>I<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 D<EB03F0EB0FF890383E1C
+6090387C0FF0EBF807EA01F0EA03E00007EB03E0EA0FC0A2381F800715C0EA3F00A2140F
+481480127EA2141F00FE14005A1506EC3F07EC3E0F150E147E007C141EECFE1CEB01FCD8
+3C03133C393E07BE38391F0E1E783907FC0FF03901F003C0202278A027>97
+D<14FCEB07FF90381F078090383E03C0EBFC013801F8033803F0073807E00F13C0120F39
+1F80070091C7FC48C8FCA35A127EA312FE5AA4007C14C0EC01E0A2EC03C06CEB0F80EC1F
+006C137C380F81F03803FFC0C648C7FC1B2278A023>99 D<ED0FC0EC03FFA21680EC001F
+A31600A25DA2153EA2157EA2157CA215FCA2903803F0F8EB0FF8EB3E1DEB7C0F496C5AEA
+01F0EA03E000071303D80FC05BA2381F8007A2D83F005BA2140F5A007E5CA2141F12FE48
+91C7FC1506EC3F075DEC3E0E147E007C141EECFE1CEB01FCD83C03133C393E07BE38391F
+0E1E783907FC0FF03901F003C0223578B327>I<EB03F8EB0FFEEB3E0F9038F807803801
+F003EA03E0EA07C0120FEA1F801407D83F0013005C007E133EEB03F8387FFFE04848C7FC
+00FCC8FCA45AA4EC0180EC03C0A2007CEB0780EC1F00003C133E6C13F8380F03E03807FF
+80D801FCC7FC1A2277A023>I<EB0FC0EA03FFA25CEA001FA391C8FCA25BA2133EA2137E
+A2137CA213FCA29038F83F80ECFFE03901FBE0F09038FF80F8EC007849137C485A5B5BA2
+484813FC5D5BA2000F13015D1380A2001F13035DEB0007EDC0C048ECC1E0020F13C0003E
+1481A2007E1483ED0380007C1407160000FC140E151E48EB07F80070EB01F023357BB327
+>104 D<EB0180EB07E0A2130FEB07C0EB038090C7FCABEA01F0EA03FCEA0F1E120E121C
+123C1238EA783E1270A2137EEAF07CEA60FCC65AA212015BA212035BA2000713C0EBC1E0
+000F13C01381A21383EB038013071400130E131EEA07F8EA01F013337AB118>I<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 D<D801F01538D803FC010E13FCD80F1E131E000E143E
+121C123C0038027E137CD8783E137C0070163CA2017E13FCD8F07C491338EA60FCC65A02
+01147800014A137013F0A2020314F0000316E001E05BA2160117C001C013C00207EB0380
+A29039E00FE0071700021F130E3A01F03DF01E3A00F878F83C90393FF03FF090390FC00F
+C02E227AA033>I<011F137C90387FC1FF3A01E1E787803A03C0F703C0903880FE0FEA07
+004813FC000E1580001E9038F80700001C91C7FC1301003C5B1218120013035CA31307A2
+5C1506010F130F150E14800038141ED87C1F131C00FC143C1538013F5B39F07FC0E03970
+F3C3C0393FE1FF80260F807EC7FC22227CA023>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fe cmr9 9 71
+/Fe 71 123 df<91393FE00FE0903A01FFF83FF8903A07E01EF83C903A1F800FF07E903A
+3F001FE0FE017E133F4914C0485A1738484890381F8000ACB812C0A33B03F0001F8000B3
+A7486C497EB50083B5FCA32F357FB42D>11 D<EC1FE0ECFFFC903803F01E90390FC00780
+EB1F8090393F000FC0017E131F5BA2485AED0F8092C7FCA9ED0FC0B7FCA33901F8001F15
+0FB3A6486CEB1FE0267FFFC1B5FCA328357FB42B>I<DA1FE013FF9126FFFC0713E0903B
+03F01E1F80F0903B0FC0077E003CD91F805B90273F001FF8137E017E4A13FE495CA24848
+5C030F147C95C7FCA9187EB912FEA33B01F8000FC000187EB3A6486C496C13FF297FFFC1
+FFFE0F13F8A33D357FB440>14 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 D<EB0FE0EB7FFCEBF83E3903E00F80
+3907C007C0EB8003000F14E0391F0001F0A24814F8A2003E1300007E14FCA500FE14FEB2
+007E14FCA56CEB01F8A36C14F0A2390F8003E03907C007C0A23903E00F803900F83E00EB
+7FFCEB0FE01F347DB126>48 D<13075B5B137FEA07FFB5FC13BFEAF83F1200B3B3A2497E
+007FB51280A319327AB126>I<EB3FC0EBFFF0000313FC380F80FF391E007F80001CEB3F
+C048EB1FE048130F15F00060130712FC6C14F87E1403A3007E1307123CC7FC15F0A2140F
+15E0EC1FC0A2EC3F801500147E5C495A5C495A495A495A49C7FC133E133C4913185B485A
+48481330485A48C7FC001C1470001FB512F05A5AB612E0A31D327CB126>I<EB1FE0EBFF
+FC4813FF3907E03F80390F001FC0001EEB0FE0001CEB07F0123F018013F8140313C01380
+A2381F0007C7FC15F0A2EC0FE015C0141FEC3F80EC7E00EB01F8EB7FE014FCEB003FEC1F
+C0EC0FE0EC07F015F8140315FC140115FEA3127EB4FCA415FC48130312780070EB07F86C
+14F0003C130F001FEB1FE0390FE03F800003B51200C613FCEB1FE01F347DB126>I<EC01
+C0A214031407A2140F141FA2143F147F146F14CF1301EB038F140F1307130E130C131C13
+381330137013E013C0EA0180120313001206120E120C5A123812305A12E0B71280A3C738
+0FC000A94A7E0107B51280A321337EB226>I<000C14C0380FC00F90B5128015005C5C14
+F014C0D80C18C7FC90C8FCA9EB0FC0EB7FF8EBF07C380FC03F9038001F80EC0FC0120E00
+0CEB07E0A2C713F01403A215F8A41218127E12FEA315F0140712F8006014E01270EC0FC0
+6C131F003C14806CEB7F00380F80FE3807FFF8000113E038003F801D347CB126>I<14FE
+903807FF80011F13E090383F00F0017C13703901F801F8EBF003EA03E01207EA0FC0EC01
+F04848C7FCA248C8FCA35A127EEB07F0EB1FFC38FE381F9038700F809038E007C039FFC0
+03E0018013F0EC01F8130015FC1400A24814FEA5127EA4127F6C14FCA26C1301018013F8
+000F14F0EBC0030007EB07E03903E00FC03901F81F806CB51200EB3FFCEB0FE01F347DB1
+26>I<1230123C003FB6FCA34814FEA215FC0070C7123800601430157015E04814C01401
+EC0380C7EA07001406140E5C141814385CA25CA2495A1303A3495AA2130FA3131F91C7FC
+A25BA55BA9131C20347CB126>I<EB0FE0EB7FFC90B5FC3903F01F803907C007C0390F00
+03E0000EEB01F0001E1300001C14F8003C1478A3123EA2003F14F86D13F0EBC001D81FF0
+13E09038F803C0390FFE07803907FF0F006C13DE6C13F87EEB3FFE8001F713C0D803E313
+E0D8078013F0390F007FF8001E131F003EEB07FC003C1303481301EC007E12F848143EA2
+151EA37E153C1278007C14787E6C14F0390F8003E03907F01FC00001B5120038007FFCEB
+1FE01F347DB126>I<EB0FE0EB7FF8EBFFFE3803F83F3907E00F80390FC007C0D81F8013
+E0EC03F0EA3F0048EB01F8127EA200FE14FC1400A415FEA5007E1301A2127F7E1403EA1F
+80000F13073807C00E3803E01C3801F03838007FF090381FC0FC90C7FC1401A215F8A215
+F01403001F14E0383F800715C0140FEC1F809038003F00001C137E381F01FC380FFFF000
+0313C0C690C7FC1F347DB126>I<123C127E12FFA4127E123C1200B0123C127E12FFA412
+7E123C08207A9F15>I<15E0A34A7EA24A7EA34A7EA3EC0DFE140CA2EC187FA34A6C7EA2
+02707FEC601FA202E07FECC00FA2D901807F1507A249486C7EA301066D7EA2010E80010F
+B5FCA249800118C77EA24981163FA2496E7EA3496E7EA20001821607487ED81FF04A7ED8
+FFFE49B512E0A333367DB53A>65 D<DA03FE130C91393FFF801C91B512E0903A03FE01F8
+3C903A0FF0003C7CD91FC0EB0EFCD97F80130701FEC7120348481401000315005B484815
+7C485A173C485A171C123F5B007F160CA390C9FC481600AB7E6D150CA3123F7F001F161C
+17186C7E17386C6C15306C6C15706D15E012016C6CEC01C0D97F80EB0380D91FC0EB0F00
+D90FF0131ED903FE13FC0100B512F0023F13C0DA03FEC7FC2E377CB437>67
+D<B77E16F016FE3A01FE0001FF00009138003FC0EE0FE0707E707E707E707E177E177FEF
+3F80A2EF1FC0A3EF0FE0A418F0AA18E0A3171F18C0A21880173F18005F17FE5F4C5AEE07
+F04C5AEE3FC000014AB45AB748C7FC16F8168034337EB23B>I<B812C0A3D803FCC7127F
+0001150FEE03E01601A21600A21760A403061330A41700150EA2151E157E90B512FEA390
+38FC007E151E150EA21506170CA3171892C7FCA41738A21770A217F01601160316070003
+157FB812E0A32E337DB234>I<B81280A3D803FCC7FC0001151FEE07C01603A21601A216
+00A41760150CA31700A2151CA2153C15FC90B5FCA3EBFC00153C151CA2150CA592C8FCAB
+487EB512FEA32B337DB232>I<DA03FE130C91393FFF801C91B512E0903A03FE01F83C90
+3A0FF0003C7CD91FC0EB0EFCD97F80130701FEC7120348481401000315005B4848157C48
+5A173C485A171C123F5B007F160CA390C9FC4893C7FCAA0303B512E07E7F92390003FE00
+705A123F7F121FA26C7E7F12076C7E7F6C6C14036C7E6D6C1307D91FC0EB0E7CD90FF0EB
+1C3CD903FEEBF81C0100B5EAF00C023F01C0C7FCDA03FEC8FC33377CB43C>I<B512FEA3
+000113006C5AB3B3A7487EB512FEA317337EB21C>73 D<017FB5FCA39038003FE0EC1FC0
+B3B1127EB4FCA4EC3F805A0060140000705B6C13FE6C485A380F03F03803FFC0C690C7FC
+20357DB227>I<B500FE903807FFF8A3000190C7000113006C48EC00FC17F04C5A4C5A4C
+C7FC160E5E5E5E5E4B5A4B5A4BC8FC150E5D5D15F84A7E14034A7EEC0EFF5C4A6C7E4A6C
+7EECE01FD9FFC07F4A6C7E4A6C7E5B6F7E6F7EA26F7E707EA2707E707E160F83707E707E
+A283486C913807FF80B500FE013F13FCA336337EB23C>I<B512FEA3D803FEC9FC6C5AB3
+A9EE0180A416031700A45EA25E5E5E5E16FE00031407B7FCA329337DB230>I<D8FFFC92
+3801FFF86D5DA20003EFFE00D801BFED06FCA3D99F80140CA2D98FC01418A3D987E01430
+A2D983F01460A3D981F814C0A3D980FCEB0180A2027EEB0300A36E1306A26E6C5AA36E6C
+5AA36E6C5AA26E6C5AA36E6C5AA3913800FD80A2037FC7FCA3486C133ED80FF04B7EB501
+1C90387FFFF8A33D337CB246>I<D8FFFE91381FFFF87F80C6030013006E143CD9DFE014
+18EBCFF0A2EBC7F8EBC3FCA2EBC1FEEBC0FF6E7EA26E7E6E7EA26E7E6E7E6E7EA26E7E6E
+7EA2ED7F80ED3FC0ED1FE0A2ED0FF0ED07F8A2ED03FCED01FEED00FFA2EE7F98EE3FD8A2
+EE1FF8160F1607A216031601A2486C1400D807F81578B500C01438A2171835337EB23A>
+I<EC07FC91387FFFC0903901FC07F0903907E000FCD90F80133E013FC76C7E017E6E7E49
+6E7E48486E7E48486E7EA248486E7E000F8249157E001F167FA24848ED3F80A2007F17C0
+A290C9121FA24817E0AB6C17C06D153FA3003F17806D157FA2001F17006D5D000F5E6C6C
+4A5AA26C6C4A5A00015E6C6C4A5A017E4A5A6D4A5AD91FC0017FC7FCD907E013FC903901
+FC07F09039007FFFC0DA07FCC8FC33377CB43C>I<B612FEEDFFC016F03A03FC0007FC00
+01EC00FE167FEE3F80EE1FC017E0160FA217F0A617E0A2EE1FC0A2EE3F80EE7F0016FEED
+07F890B65A168001FCC9FCB3A2487EB512F8A32C337DB234>I<EC07FC91387FFFC09039
+01FC07F0903907E000FC4948137E013FC7EA1F80017E6E7E496E7E48486E7E0003824914
+0148486E7E000F8249157E001F167FA24848ED3F80A2007F17C0A390C9121F4817E0AB6C
+17C0A26D153FA2003F1780A26D157F001F1700A2270FE001F013FE0007D907FC5B9039F0
+0E0E013B03F80C0703F8000190391C0383F03B00FC180187E0017EECCFC0013FECDF8090
+271F9C00FFC7FCD907EC13FC902701FE07F013609038007FFF913807FC7091C7007813E0
+A2EE7C01EE7E0393387F07C0EE3FFFA21880821800705A705AEE01F033447CB43C>I<B6
+12FCEDFF8016F03A01FE0007FC0000EC01FEED007F707E707E83160F83A65FA24C5AA24C
+5A047EC7FC4B5AED0FF090B612C093C8FC9039FE001FC0ED07F06F7E6F7E150082167E16
+7FA583A5180C17C0A2043F131C486C1618B500FEEB1FE0040F1338933807F070C93801FF
+E09338003F8036357EB239>I<90381FE00390387FFC0748B5FC3907F01FCF390F8003FF
+48C7FC003E80814880A200788000F880A46C80A27E92C7FC127F13C0EA3FF013FF6C13F0
+6C13FF6C14C06C14F0C680013F7F01037F9038003FFF140302001380157F153FED1FC015
+0F12C0A21507A37EA26CEC0F80A26C15006C5C6C143E6C147E01C05B39F1FC03F800E0B5
+12E0011F138026C003FEC7FC22377CB42B>I<007FB712FEA390398007F001D87C00EC00
+3E0078161E0070160EA20060160600E01607A3481603A6C71500B3AB4A7E011FB512FCA3
+30337DB237>I<B500F0903803FFF8A3D807FEC8EA7FC06C48ED1F000001161E6D151C00
+001618A26D15386D1530A26D6C5CA26E14E0011F5DA26D6C495AA28001074AC7FCA26D6C
+1306A28001015CA26E131C01001418806E5BA2ED8070023F1360A26E6C5AA215E1020F5B
+A2DA07F3C8FCA215FBEC03FEA36E5AA26E5AA31570A235357EB23A>86
+D<B5D8F007B539800FFFF0A3000390C7273FF000011300D801FC6E48EB007C1A386D140F
+00001930836D020715706D1860A26E496C14E0013F60A26ED919FC1301011F60A26ED930
+FE1303010F95C7FCA26ED9607F5B01071706A26E9039C03F800E0103170CA2913BFC0180
+1FC01C01011718A2913BFE03000FE03801001730A2DAFF06EB07F0027F5EA2038CEB03F8
+023F5EA203D8EB01FC021FEDFD80A203F0EB00FF020F93C8FCA24B800207157EA24B143E
+0203153CA24B141C020115184C357FB24F>I<267FFFFC90B512C0A3000101E090381FF8
+0026007F80EB0FC0013F6E5A6E91C7FC6D6C130E010F140C6E5B6D6C133801035C6E1360
+6D6C13E06D6C485A5EDA7F83C8FCEC3FC715C6EC1FECEC0FFC5D14076E7EA26E7E815C6F
+7E9138063FC0140E4A6C7E9138180FF0EC380702707F91386003FCECC0010101804A6C7E
+49C77E4981010E6E7E010C6E7E131C496E7E01786E7E13FCD807FEEC1FFEB56C90B512F8
+A335337EB23A>I<EAFFF0A4EAF000B3B3B3ADEAFFF0A40C4B79B715>91
+D<0003130C48131C000E133848137000181360003813E0003013C0EA700100601380A2EA
+E00300C01300A400DE137800FF13FCEB83FEA2EA7F81A2383F00FC001E1378171774B326
+>I<EAFFF0A41200B3B3B3AD12FFA40C4B7FB715>I<12035A120E5A121812381230127012
+60A212E05AA412DEB4FC1380A2127FA2EA3F00121E09177BB315>96
+D<EB7F803803FFF0380F80FC381C003E003F133F6D6C7E6E7EA26E7EEA1F00C7FCA4EB01
+FF131FEBFF873803FC07EA0FF0EA1FC0EA3F80127F13004815C05AA3140FA26C131F6C13
+3B3A3F8071F180391FC1E1FF2607FFC013003900FE003C22237DA126>I<EA03F012FFA3
+12071203AEEC3F80ECFFE09038F3C0F89038F7007E01FE7F49EB1F8049EB0FC05BED07E0
+16F0A2150316F8AA16F0150716E0A2ED0FC07F6DEB1F8001ECEB3F0001CF137C90388381
+F8903801FFE0C76CC7FC25357EB32B>I<EB07F8EB3FFF9038FC07C03901F000E03903E0
+03F03807C007120FEA1F80123F90380003E04890C7FCA2127E12FEAA127FA26C14187F00
+1F14386D1330000F14706C6C13E03903F001C03900FC0F8090383FFE00EB07F01D237EA1
+22>I<153FEC0FFFA3EC007F81AEEB07F0EB3FFCEBFC0F3901F003BF3907E001FF48487E
+48487F8148C7FCA25A127E12FEAA127E127FA27E6C6C5BA26C6C5B6C6C4813803A03F007
+BFFC3900F81E3FEB3FFCD90FE0130026357DB32B>I<EB0FE0EB7FFCEBF83F3903F00F80
+D807E013C0390FC007E0381F800315F0EA3F0014014814F8127EA212FEA2B6FCA248C8FC
+A5127E127FA26C1418A26C6C1338000F14306D13706C6C13E03901F003C03900FC0F00EB
+3FFEEB07F01D237EA122>I<EB01FCEB07FF90381F078090383E0FC0EB7C1F13FCEA01F8
+A20003EB070049C7FCACB512F0A3D803F0C7FCB3A7487E387FFFE0A31A357FB417>I<15
+1F90391FC07F809039FFF8E3C03901F07FC73907E03F033A0FC01F83809039800F800000
+1F80EB00074880A66C5CEB800F000F5CEBC01F6C6C48C7FCEBF07C380EFFF8380C1FC000
+1CC9FCA3121EA2121F380FFFFEECFFC06C14F06C14FC4880381F0001003EEB007F4880ED
+1F8048140FA56C141F007C15006C143E6C5C390FC001F83903F007E0C6B51280D91FFCC7
+FC22337EA126>I<EA03F012FFA312071203AEEC1FC0EC7FF09038F1E0FC9038F3807C90
+38F7007E13FE497FA25BA25BB3486CEB7F80B538C7FFFCA326347EB32B>I<EA0780EA0F
+C0EA1FE0A4EA0FC0EA0780C7FCAAEA07E012FFA3120F1207B3A6EA0FF0B5FCA310337EB2
+15>I<EB03C0EB07E0EB0FF0A4EB07E0EB03C090C7FCAAEB03F013FFA313071303B3B012
+38127C00FE13E0130714C0130F007C138038381F00EA1FFCEA07F0144384B217>I<EA03
+F012FFA312071203AF913803FFE0A36E1300EC00F8EC01E05D4A5A020FC7FC141C5C5C14
+F0EBF3F8EBF7FC13FEEBFC7EEBF87F496C7E141F6E7E8114076E7E8114016E7E81486CEB
+FF80B500C313F0A324347EB329>I<EA07E012FFA3120F1207B3B3A7EA0FF0B5FCA31034
+7EB315>I<2703F01FE013FF00FF90267FF80313C0903BF1E07C0F03E0903BF3803E1C01
+F02807F7003F387FD803FE1470496D486C7EA2495CA2495CB3486C496C487EB53BC7FFFE
+3FFFF0A33C217EA041>I<3903F01FC000FFEB7FF09038F1E0FC9038F3807C3907F7007E
+EA03FE497FA25BA25BB3486CEB7F80B538C7FFFCA326217EA02B>I<EB07F0EB3FFE9038
+FC1F803901F007C03903C001E000078048486C7E48C7127CA248147E003E143E007E143F
+A300FE1580A8007E1500A36C147EA26C147C6D13FC6C6C485A00075C3903F007E03900FC
+1F80D93FFEC7FCEB07F021237EA126>I<3903F03F8000FFEBFFE09038F3C0F89038F700
+7ED807FE7F6C48EB1F804914C049130F16E0ED07F0A3ED03F8A9150716F0A216E0150F16
+C06D131F6DEB3F80160001FF13FC9038F381F89038F1FFE0D9F07FC7FC91C8FCAA487EB5
+12C0A325307EA02B>I<903807F00390383FFC07EBFC0F3901F8038F3807E001000F14DF
+48486CB4FC497F123F90C77E5AA25A5AA9127FA36C6C5B121F6D5B000F5B3907E003BF39
+03F0073F3800F81EEB3FF8EB0FE090C7FCAAED7F8091380FFFFCA326307DA029>I<3803
+E07C38FFE1FF9038E38F809038E71FC0EA07EEEA03ECA29038FC0F8049C7FCA35BB2487E
+B512E0A31A217FA01E>I<EBFF06000713CE381F00FE003C133E48131E140E5A1406A27E
+A200FE90C7FC6C7EEA7FFC383FFFC014F0000F7F6C7FC67FEB0FFF1300EC3F8000C0131F
+140F6C1307A37E15006C5B6C130E6C5B38F7807838E1FFE038C07F8019237EA11E>I<13
+30A51370A313F0A21201A212031207381FFFFEB5FCA23803F000AF1403A814073801F806
+A23800FC0EEB7E1CEB1FF8EB07E0182F7FAD1E>I<D803F0133F00FFEB0FFFA30007EB00
+7F000380B35DA35D12016D4813800000903803BFFC90387E073FEB1FFED907F813002622
+7EA02B>I<B5EBFFF0A3D80FF0EB3F800007EC1F000003140E150C6D131C00011418A26C
+6C5BA26D1370017E1360137F6D5BA290381F8180A214C3010F90C7FCA2EB07E6A214FE6D
+5AA26D5AA36D5AA2146024217E9F29>I<B53A1FFF81FFF0A33C07F801FC003F8001F049
+EB1E0000030100141C816C6C017C1318A26D017E1338000002FE1330A290267E01FF5B15
+9F168090263F030F5BA216C0903A1F8607C180A202C613E390260FCC0390C7FCA2D907FC
+13F6ECF80116FE6D486C5AA36D481378A36D48133034217F9F37>I<B53801FFF8A32603
+FE0013806C48EB7C0000001478017E1370017F5B90383F81C090381F8380D90FC3C7FCEB
+07E614FE6D5A6D5A6D7E80805B9038039F809038071FC09038060FE0EB0C0790381C03F0
+496C7E01707FEBF000000180000FECFF8026FFFC0313FCA326207F9F29>I<3A7FFF807F
+F8A33A07F8001FC00003EC0F800001EC070015066C6C5BA26D131C017E1318A26D5BA2EC
+8070011F1360ECC0E0010F5BA2903807E180A214F3010390C7FC14FBEB01FEA26D5AA314
+78A21430A25CA214E05CA2495A1278D8FC03C8FCA21306130EEA701CEA7838EA1FF0EA0F
+C025307F9F29>I<003FB512F0A2EB000F003C14E00038EB1FC00030EB3F800070137F15
+00006013FE495A13035CC6485A495AA2495A495A49C7FC153013FE485A12035B48481370
+485A001F14604913E0485A387F000348130F90B5FCA21C207E9F22>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Ff cmtt9 9 51
+/Ff 51 122 df<00101320007C13F838FE01FCAAEAFC00007C13F8A900381370161778AE
+27>34 D<EB01C0EB03E0130F131FEB3FC0EB7F80EBFE00485A5B1203485A5B485AA2485A
+A248C7FCA3127EA45AAC127EA47EA36C7EA26C7EA26C7E7F6C7E12017F6C7EEB7F80EB3F
+C0EB1FE0130F1303EB01C0133A73B327>40 D<127012F812FE7E6C7E6C7EEA0FE06C7E12
+037F6C7E1200137EA27FA2EB1F80A3EB0FC0A4EB07E0ACEB0FC0A4EB1F80A3EB3F00A213
+7EA25B1201485A5B1207485AEA3FC0485A48C7FC5A12F81270133A7AB327>I<007FB512
+F8B612FCA46C14F81E067C9927>45 D<121EEA7F80A2EAFFC0A4EA7F80A2EA1E000A0A72
+8927>I<1538157C15FCA2140115F8140315F0140715E0140F15C0141F1580143F1500A2
+5C147E14FE5C13015C13035C13075C130F5CA2131F5C133F91C7FC5B137E13FE5B12015B
+12035BA212075B120F5B121F5B123F90C8FC5A127E12FE5AA25A12781E3A7CB327>I<EB
+07E0EB3FFC497E90B5FC4814803903FC3FC03907F00FE0390FE007F0EBC003391F8001F8
+A248C712FCA2003E147C007E147EA3007C143E00FC143FAC007E147EA46C14FCA2EB8001
+001F14F8EBC003000F14F0EBE0073907F00FE03903FC3FC06CB512806C14006D5A6D5AEB
+07E020307DAE27>I<007FB512FEB7FCA4003F14FEC9FCA6003FB512FEB7FCA46C14FE20
+127D9F27>61 D<EB03F0497EA2497EA4143CEB1F3EA5EB3F3FA3EB3E1FA2017E7FA4496C
+7EA548486C7EA390B5FCA24880A3EBF003A248486C7EA4000F803A7FFC0FFF8000FF15C0
+6D5A497E007F1580222F7EAE27>65 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 D<EBFFFC0007EBFF80001F14E0A24814F0EBC00F39
+7F8007F8EB0003007E1301A348EB00FCB3A76C1301007E14F8A3007F1303EB8007393FE0
+1FF090B5FC6C14E0A200071480C6EBFC001E307CAE27>I<007FB5FCB612E081816C8039
+07E003FEEC00FF81ED3F80151F16C0150FA6151F1680153FED7F005DEC03FE90B55A5D5D
+5D92C7FC01E0C8FCADEA7FFEB5FCA36C5A222E7FAD27>I<387FFFF0B512FE6E7E816C80
+3907E01FF014076E7E1401811400A514015D14034A5A141F90B55A5D5DA281EBE01F6E7E
+14076E7EA816F0EDF1F8A4397FFE01FBB5EBFFF08016E06C48EB7FC0C8EA1F00252F7FAD
+27>82 D<90387FC0E03901FFF1F0000713FF5A5AEA3FE0EB801F387F000F007E130712FE
+5A1403A3EC01E06C90C7FC127E127FEA3FC013F86CB47E6C13F86C13FE6CEBFF80C614C0
+010F13E0010013F0140FEC07F81403140115FC1400127812FCA46CEB01F8A26C13039038
+8007F09038F01FE090B5FC15C0150000F85B38701FF81E307CAE27>I<007FB61280B712
+C0A439FC03F00FA60078EC0780000091C7FCB3AB90B512C04880A36C5C222E7EAD27>I<
+3A7FFE01FFF8B54813FCA36C486C13F83A07E0001F80B3AB6D133F00031500A26D5B0001
+147E6D13FE6C6C485A90387F87F814FF6D5B010F13C06D5BD901FEC7FC262F80AD27>I<
+3A7FFC03FFE06D5A00FF15F0007F15E0497E3A07E0007E00A46C6C5BA4EBF80100015CA4
+6C6C485AA490387E07E0A56D485AA4011F5B149FA3010F90C7FCA5EB07FEA46D5AA26D5A
+242F7FAD27>I<D87FE0EB7FE0486CEBFFF0A36C48EB7FE0001FC7EA0F80A76C6CEB1F00
+A614F0EB81F83907C3FC3EA4149CEBC79EA30003143CA301E7137CEBEF9FA2140FA20001
+1478A49038FE07F8A300005CA2EBFC0390387801E0242F7FAD27>I<393FFC1FFE387FFE
+3F815D383FFC1F3903F00FE001F85B1201EBFC1F00005CEBFE3F017E90C7FCEB7F7FEB3F
+7E14FE6D5AA26D5AA26D5AA21303130780130F80131F80EB3F7E147F497E017E7F141F01
+FC7F140FD801F87F14071203496C7E120701E07F3A7FFC0FFF8000FF15C06D5A497E007F
+1580222E7EAD27>I<007FB512F8B612FCA46C14F81E067C7E27>95
+D<3803FFC0000F13F04813FC4813FF811380EC1FC0381F000F000480C71207A2EB0FFF13
+7F0003B5FC120F5A383FFC07EA7FC0130012FE5AA46C130F007F131FEBC0FF6CB612806C
+15C07E000313F1C69038807F8022207C9F27>97 D<EA7FE0487EA3127F1203A914FF01F3
+13C090B512F08181EC81FE49C67E49EB3F8049131F16C049130FA216E01507A6150F16C0
+7F151F6DEB3F80157F6DEBFF009038FF83FEECFFFC5D5D01F313C02601E0FEC7FC232E7F
+AD27>I<EB0FFF017F13C048B512E04814F05A380FF807EA1FE0393FC003E09038800080
+48C8FC127EA212FE5AA67E127EA2007F14F0393F8001F813C0381FE003390FF80FF06CB5
+FC6C14E06C14C06C6C1300EB0FF81D207B9F27>I<EC3FF04A7EA3143F1401A9EB0FE1EB
+7FFD48B5FC5A5A380FF83F381FE00F383FC007EB8003EA7F00007E1301A212FE5AA67E00
+7E1303A2127F6C1307EB800F381FE01F380FF03F6CB612C06C15E06C13FD38007FF9D91F
+E013C0232E7EAD27>I<EB0FF8EB3FFE90B51280000314C04814E0390FFC0FF0391FE003
+F8EBC001D83F8013FC48C7FC127E157E12FEB612FEA415FC00FCC8FC7E127E127F6C143C
+6D137E6C7E01F013FE390FFC07FC6CB5FC000114F86C14F0013F13C0903807FE001F207D
+9F27>I<EC1FF0ECFFF84913FC4913FE5BEB0FF014C0011F137CEC8000A6007FB512F0B6
+12F8A36C14F039001F8000B3A4003FB512C04814E0A36C14C01F2E7EAD27>I<153F9039
+1FC0FF80D97FF313C048B612E05A4814EF390FF07F873A1FC01FC3C0EDC000EB800F4848
+6C7EA66C6C485AEBC01FA2390FF07F8090B5C7FC5C485BEB7FF0EB1FC090C9FCA27F6CB5
+FC15E015F84814FE4880EB8001007EC7EA3F80007C140F00FC15C0481407A46C140F007C
+1580007F143F6C6CEB7F009038F807FF6CB55A000714F86C5CC614C0D90FFCC7FC23337E
+A027>I<EA7FE0487EA3127F1203A9147F9038F1FFC001F713F090B5FC8114C1EC01FCEB
+FE005B5BA25BB03A7FFF83FFE0B500C713F0A36C018313E0242E7FAD27>I<130F497E49
+7EA46D5A6DC7FC90C8FCA7383FFF80487FA37EEA000FB3A4007FB512F0B6FC15F815F07E
+1D2F7BAE27>I<143C147E14FFA4147E143C1400A73801FFFE4813FFA37EC7123FB3B014
+7E1238007C13FE38FE01FC1303B512F814F06C13E06C13803807FE0018407CAE27>I<EA
+7FE07F12FF127FA21201A991383FFFC04A13E0A36E13C0913803F8004A5A4A5A4A5A4A5A
+02FFC7FCEBF1FEEBF3FCEBF7F8EBFFFC8080143F496C7E496C7E01F87FEBF0076E7E6E7E
+816E7E157E3A7FFFC1FFF002C313F8B512E36C13C316F0252E80AD27>I<387FFF80B57E
+A37EEA000FB3B2007FB512F8B612FCA36C14F81E2E7CAD27>I<397F07C01F3AFF9FF07F
+C09039FFF9FFE091B57E7E3A0FFC7FF1F89038F03FC001E0138001C01300A3EB803EB03A
+7FF0FFC3FF486C01E3138001F913E701F813E36C4801C313002920819F27>I<387FE07F
+39FFF1FFC001F713F090B5FC6C80000313C1EC01FCEBFE005B5BA25BB03A7FFF83FFE0B5
+00C713F0A36C018313E024207F9F27>I<EB1FE0EB7FF83801FFFE487F481480390FF03F
+C0391FC00FE0393F8007F0EB00034814F8007E1301A248EB00FCA76C1301007E14F8A200
+7F1303393F8007F0A2391FE01FE0390FF03FC06CB512806C14006C5B38007FF8EB1FE01E
+207C9F27>I<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 df<EC3FFF49B512E0010714F8011F8049805B90B7FC48EBE001481300485A
+EA0FF8496D5A4848147C93C7FC485A5B127F90CAFCA35A5AA97E7EA27F123F6D141F6DEC
+3F80121F6C7E01FC147F6C6CECFF006C6C6C5A6C9038F00FFE91B55A6C6C5C6D5C6D5C01
+071480010149C7FC9038003FF0293278B038>99 D<EC3FE0903801FFFC010713FF011F14
+C04980498090B67E489038E03FFC4890380007FE48481301D80FF86D7E49804848158049
+143F003F16C049141F127F90C8FC17E0160F5A90B7FCA617C048CAFC7E7EA27FA26C7EEE
+07C06C6CEC0FE07F6C7ED807FE141F6DEC3FC06C01C013FF6CD9FC0713806C90B612006D
+5C6D5C010F5C010314E001001480DA1FFCC7FC2B327AB038>101
+D<ED3FC03A3FFE01FFF8267FFF0713FEB5001F7F4A804A806C90B67E6C02C07F3B007FFE
+001FF802F86D7E4A13034A6D7E5C707E4A80188091C8123FA318C0171FA9173F6E1580A2
+177FA26EECFF00A26E495A6E13034C5A6E495A02FE133F6E6CB45A92B55A6E5C6E5C6E91
+C7FC6E13FC020313F09138007F8092C9FCB0383FFFFE487FB67EA36C91C9FC6C5B32487F
+AF38>112 D<EB01E0497E1307AB003FB712804816C0B8FCA46C1680260007F0C8FCB3A4
+EE03E0EE07F0A66E130F17E06D6C131F6EEB3FC0903901FF81FF92B512806D15006E5B6E
+5B6E13F002075B020190C7FC2C3D7DBB38>116 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>I<EA0FC0EA1FE0EA3FF0EA7FF8EAFFFCA313FEA3127F123F121FEA0FDEEA001EA213
+3E133CA2137CA2137813F813F01201EA03E0EA07C0A2EA0F80EA1F00121E120C0F207B8D
+19>44 D<EA0FC0EA1FE0EA3FF0EA7FF8EAFFFCA6EA7FF8EA3FF0EA1FE0EA0FC00E0E7B8D
+19>46 D<EB01FE90380FFFC0013F13F090B512FC48EB87FE3903FE01FF48486C1380A248
+48EB7FC0001F15E049133FA2003F15F0A3007F15F8A500FF15FCB3A3007F15F8A6003F15
+F0A36C6CEB7FE0A2000F15C06D13FF000715806C6C4813003901FF87FE6CEBFFFC013F13
+F06D5BD901FEC7FC263D7DBB2D>48 D<143C147CEB01FC1307131FEA03FFB5FCA4EAFC1F
+1200B3B3A8007FB6FCA5203C7ABB2D>I<EB0FFC90387FFF8048B512E04814F84880390F
+F07FFE391F801FFF48486C1380387FC00701E014C0486C6C13E013F88016F0A4EA7FF0EA
+3FE0EA1FC0EA0700C7FC16E05CA216C04A1380A24A13005D4A5A5D4A5A5D4A5A4A5A4990
+C7FC5CEB03F8903907F001F0EB0FE014C090391F8003E0EB3F00137E5B491307485A48B6
+FC4815C05AA25A5A5AB7FC1680A4243C7CBB2D>I<EB0FFC90383FFFC090B512F0488039
+03F83FFC3907E00FFED80FC07F486C6C138013F801FC14C0123F13FEA5EA1FFC1680EA0F
+F8D803E01400C75A5D5D4A5A5DEC7FE090381FFFC092C7FC15C015F09038003FF8EC0FFE
+816E1380A216C06E13E0A316F0EA0FC0EA1FE0EA3FF0EA7FF8EAFFFCA416E0A2495A007F
+15C013F0263FC00F13801600391FF83FFE6CB55A6C5C000114E06C6C1380D90FFCC7FC24
+3D7CBB2D>I<000E1407D80F80133F9038F801FF90B6FC5D5DA25D5D5D158092C7FC14FC
+14F00180C8FCA9EB87FE90389FFFC090B512F0819038FC0FFC9038F007FE9038C003FF01
+80148016C0497EC714E0A416F0A21207EA1FC0EA3FE0EA7FF012FF13F8A316E013F0A26C
+484813C01380D87E0014806C491300391FC00FFE390FF03FFC6CB55A6C5C6C14C06C91C7
+FCEB1FF8243D7CBB2D>53 D<EC3FE0903801FFF801077F011F7F90383FF07F90397FC01F
+809038FF807F48EB00FF484913C048485AA2EA0FFCA2121FA2003F6D1380496C1300157E
+007F91C7FCA314309038F9FF80D8FFFB13E090B512F881EC07FE496C7E496C1380A216C0
+A201F814E0A316F0A6127FA5123F16E0A2121F16C0EA0FFC168000075B01FE14003903FF
+0FFE6CEBFFFC6C5C013F5B6D13C0D903FEC7FC243D7CBB2D>I<EB07FE90381FFFC0017F
+13F090B57E3901FE0FFC3903F803FE48486C7E000F6D1380A2485AED7FC0123FA37FA27F
+7F6DEBFF806D7E6E13006C13F1ECFBFE6CEBFFFC5D6C14E0A26C14F86C806C8081481580
+5AD807FB14C0EA0FF048486C13E0003F131F497E007F010313F08000FF7F49137F153FA2
+151FA416E06C7E153F6D14C0003F147F6D14803A1FF801FF00390FFE07FE6CB55A6C5CC6
+5C013F13C0D907FEC7FC243D7CBB2D>56 D<EB07FE90383FFF8090B512E0488048EB0FF8
+48486C7E48486C7E001F80497E003F1580A2127F16C0A212FF16E0A516F0A6127FA3003F
+5BA2121FA26C6C5A6C6C5A6CB6FC7E38007FFDD91FF913E0EB00C11401A3D807E014C0EA
+0FF0486C5AD83FFC1480A316004A5AA249485AD81FF05B9038E03FF0000F495A90B55A6C
+5C6C91C7FCC613FCEB3FE0243D7CBB2D>I<ED07804B7E4B7EA34B7EA34B7EA34B7EA34A
+7FA34A7FA24A8015CFA2020F801587A2021F801503A2023F80EC3E01A2027E80EC7C00A2
+4A6D7EA20101814A133FA20103814A7FA249B77EA34982A29138800007011F8291C77EA2
+496E7F133EA2496E7FA201FC8249157FB500F0013FB512FCA53E3F7DBE45>65
+D<B712FEEEFFE017F817FE83C69026F0001F1380040713C07013E0A27013F0A28218F8A7
+18F05EA218E05E18C04C1380041F1300EE7FFC91B612F017C017F817FE913AF00007FF80
+7013C07013E07013F018F8177F18FCA318FEA3173F177FA418FCA217FF18F85E18F04C13
+E0160FB912C018005F17F01780373E7CBD41>I<B712FCEEFFC017F017FC17FFC69026F0
+003F7F04077F040113F082717E717E717E170F84831980A219C083A219E0A519F0A483A5
+5FA419E0A519C0A25F1980A24D1300A24D5A4D5A177F4D5A4C5B04075B043F5BB9C7FC5F
+17F817C004FCC8FC3C3E7CBD46>68 D<B812FEA483C69038F8003F16071601828383A2EF
+1F80A3170FED01F0A3EF07C0A3150394C7FCA21507151F91B5FCA5ECF81F1507150318F8
+A21501EF01F0A592C71203A218E0A21707A2170F171F18C0173F17FF1603161FB9FCA218
+80A3353D7CBC3C>I<B612F8A5C6EBF800B3B3B0B612F8A51D3E7DBD24>73
+D<B600F890B512F8A5C601F8C73803F8004D5A4D5A4D5A4D5A4DC7FC17FE4C5A4C5A4C5A
+4C5A4C5A4C5A4CC8FC16FE4B5A4B5A4B5A4B5A151F4B7E4B7EA24B7E14F902FB7F91B6FC
+15DF039F7F158F030F7F4A6C7F4A7E02F880816F7F83167F83707E82848284707F828482
+84707F177F84B6D8F80FB512FCA53E3E7CBD47>75 D<B500FC93B512F86E5DA36E5DC6F1
+F800A26FEC07BFA301FD6DEC0F3FA201FC6D141EA36E6C143CA36E6C1478A36E6C14F0A2
+6E6CEB01E0A36E6CEB03C0A36E9038800780A36E9038C00F00A26EEBE01EA36F6C5AA36F
+6C5AA36F6C5AA26FB45AA36F5BA36F5BA36F90C7FCA26F5AB500FC033FB512F8A2167CA2
+16384D3E7CBD56>77 D<B712F816FF17E08317FCC6D9F0007FEE1FFF7013808218C08218
+E0A318F0A818E0A318C05E18804C13005EEEFFFE91B612F85F17C04CC7FC02F8C9FCB3A4
+B612F8A5343E7CBD3E>80 D<B600F890B512F8A5C601F8C8EAF800B3B3A5017F150160A2
+80013F1503606D6C1407010F4B5A6E4A5A6D6D133F6D6D01FFC7FC6D9038F807FE6D6CB5
+5A6E5C020F14E0020314809126003FFCC8FC3D3F7CBD46>85 D<B600F0010FB5FCA5C601
+F8C8EA1F00A26E5D017F163EA26E157E013F167C6E15FC6D5EA26F13016D5EA26D6D495A
+A26F13076D5EA26F130F6D5E816D4BC7FCA26F5B027F143EA26F137E023F147C6F13FC6E
+5CA216816E5CA216C36E5C16E76E5CA216FF6E5CA36E91C8FCA26F5AA36F5AA36F5AA26F
+5AA36F5AA2403F7EBD45>I<B600E0B6D8F007B51280A500019026F0000101F8C73807C0
+0070160F6C6D6184177F6D6C4EC7FC84173F6D6C183E177F846E187E6D92B5147C856F17
+FC6D4A5E05F77F03C016016D02035E05E313E003E016036D02075E05C113F003F016076D
+61DC0F8013F803F8160F6D6193391F007FFC03FC161F027F95C8FC4C14FE043E013F5BDA
+3FFE163E047E14FF047C6D137EDA1FFF167C04FC15FC4C7F6E5FA24C7F6E5FA24C7F6E5F
+A24C7F6E5FA24C7F6E5FA293C8127FA26F93C9FC037E81033E153E593F7EBD5E>I<EB0F
+FE90387FFFC048B512F04814FC3907FC0FFE48486C7E6D6C7F486C7E82A26E7FA36C5A6C
+5AEA01E0C8FC5C49B5FC131F90B6FC000313F84813C0481300EA1FFC485A127F5B12FF5B
+A45CA26C6C5A16F83B3FF807BFFF80391FFC1F3F390FFFFE1F6C497E0001EBF80326003F
+E0C8FC292B7EA92C>97 D<13FFB5FCA512077EAF4AB4FC020F13E0023F13F891B57E9138
+FE07FFDAF8011380DAE00013C05C4AEB7FE017F0A3EE3FF8A317FCAC17F8A3EE7FF0A217
+E06E13FF17C06E481380DAF80313009138FE0FFE9039FC7FFFFC496C13F0496C13C0C7D8
+03FEC7FC2E407FBE33>I<EB03FF011F13E0017F13F890B57E48EB83FE3903FE01FF0007
+5B4848481380121F13F8123FA2127F496C13006E5AEC007800FF91C7FCAC127FA27F003F
+EC07C0A26C6C130F16806C6C131F000715006C6C137F6CEBC1FE6CEBFFFC6D13F0011F5B
+010390C7FC222B7DA928>I<16FF92B5FCA5150781AFEB01FF011F13E3017F13FB90B7FC
+4813C148EB003F48487F48487F001F805B123FA2485AA312FFAC127FA36C7EA3001F5C6C
+6C5B00074A13806D4913FC2603FF83B5FCC690B6FC6D13F7011F13C7903A03FE07FC002E
+407DBE33>I<49B47E010F13F0013F7F90B512FE48EBC3FF48010013804848EB7FC04848
+133F001F15E05B003FEC1FF0A2485A150F16F8A212FFA290B6FCA401F0C8FCA5127FA37F
+003F15F8A26C6C1301000F15F06D13036C6CEB07E06C9038800FC06C9038F07F806C6CB5
+12006D5B010F13F8010013C0252B7EA92A>I<EC1FF8ECFFFE01077F491480D91FF813C0
+D93FE013E0EB7FC1EBFF81481301A348486C13C0ED7F80ED3F0092C7FCAAB6FCA5000390
+C8FCB3ACB6FCA523407EBF1C>I<D907FE13FC90393FFFC3FE90B5EAF7FF4891B5128048
+130F3907FC03FE3A0FF801FF7F001FEDFF00496C13BE1680003F81A7001F5DA26D5A000F
+92C7FC6C6C485A3903FF0FFCECFFF8485CD80F3F13C0D907FEC8FC90CAFC5AA27FA213E0
+90B512F015FF6C15C0826C816C8182120F4881393FE0003FD87F80EB07FF150148C7FC81
+A56D5B007F5D6D13036C6C495AD81FF8EB1FF86CB4EBFFF06C90B55A000115806C6C49C7
+FC010713E0293D7EA82D>I<13FFB5FCA512077EAFED7FE0913801FFF802077F4A7F9138
+1FC3FFDA3E031380147CEC780102F014C014E0A214C0A31480B3A4B5D8FE1F13FFA5303F
+7EBE33>I<EA01F8487E487E487E481380A66C13006C5A6C5A6C5AC8FCA913FFB5FCA512
+077EB3ABB512F8A515407EBF19>I<EC1F80EC3FC0EC7FE0ECFFF04913F8A66D13F0EC7F
+E0EC3FC0EC1F8091C7FCA9EC07F8EB0FFFA5EB003F141FB3B3A2EA1F80EA3FC0EA7FE0EA
+FFF015F0143FA2EC7FE015C0397FE0FF80D83FC113006CB45A6C5B6C13F0C613801D5387
+BF1C>I<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>I<D9FF80EB7FC0B5EB7FFFA500
+0714036C80B3A55DA35D7E4B13E0DAC01E13FF6CEBE07E6DB45A6D5B010F13E001010180
+1300302A7EA833>I<B500E1B53887FFF8A50007903B801FF0003F006C6F133E150F02C0
+157E6C4A6C137CA26C01E05D4B7EA2D97FF04A5AED7FFF157DD93FF84A5A03FD138303F8
+1387D91FFCECC7C014FD9238F07FCFD90FFFECEF80A29238E03FFF6D93C7FCA24B7E6D5D
+A2ED800F6D5DA2ED00076D5DA24A1303027E5C027C13013D287EA742>119
+D<3B7FFFFC7FFFE0A5C69039E007E0004B5A90387FF01FD93FF85B4BC7FC90381FFC7EEB
+0FFE5D6D6C5A7F5D6D5B7FA26E7E143F814A7E14FF81497FEB03F301078002E17FEB0FC0
+49487F6F7E90383F003F017E806F7EB500E0B512F8A52D287FA730>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fi cmbx12 13.14 37
+/Fi 37 122 df<923807FFE092B512FC020714FF021F81027F9038007FC0902601FFF0EB
+0FE04901C0497E4990C7487ED90FFC147F011F824A14FF495AA2137F5CA2715A715A715A
+EF078094C8FCA7EF07FCB9FCA526007FF0C7123F171FB3B3A2003FB5D8E00FB512F8A53D
+4D7ECC44>12 D<EA07E0EA1FF8EA3FFCEA7FFEA2B5FCA6EA7FFEA2EA3FFCEA1FF8EA07E0
+1010778F22>46 D<EC0FFC91B512C0010714F8498090393FFC0FFF90267FE0017F49486C
+7F48496D7E4890C76C7E49141F000782000F8249140F001F82A3003F824980A2007F1780
+A600FF17C0B3A4007F1780A6003F17006D5CA2001F5EA3000F5E6D141F00075E6D143F6C
+5E6C6D495A6C6D495A90267FF0035B90263FFC0F90C7FC010FB512FC6D5C010014C0DA0F
+FCC8FC32487BC63D>48 D<15F014011407141F147FEB03FF137FB6FCA313FC1380C7FCB3
+B3B2007FB712E0A52B4777C63D>I<ECFFF80107EBFF80013F14F090B612FC4881480101
+EBFF802707F8003F13C0D80FE0010F13E0D81F806D13F0003F80D87FF06D13F86D15FC6D
+7F00FF16FE6D147FA217FF82A36C5A6C5A6C5A6C5AC95A17FEA3EEFFFCA24B13F817F05D
+17E04B13C017804B13004B5A4B5A5EED7FE04B5A4A5B4A90C7FCEC07FC4A5A4A5A4B131F
+EC3F804AC7FC14FE4948143E495AEB07E0495A4948147E49C8FC017E15FE90B7FC4816FC
+5A5A5A5A5A5AB8FC17F8A430477AC63D>I<EC3FFE0103B512E0010F14FC013F14FF9026
+7FE01F7F9026FF000713E0D801FC6D7FD803F07F486C6D7FD80FFE817F486D80167FA380
+5C16FF7E91C75B6C5A6C5AD80020495B90C75C5D5F4B5B5F031F90C7FCED3FFC4AB45A49
+B512E0168016E016FC90C7EA3FFF030713C06F7F6F7F6F7F83707E83A2701380A318C0EA
+07E0EA1FF8487E487EA2B5FCA31880A25E491600127F494A5A6C485D01E05B001F4A5BD8
+0FFC495B2707FFC03F13C06C90B65AC64BC7FC013F14F8010714E09026007FFEC8FC3248
+7BC63D>I<EE07E0160FA2161F163F167F16FFA25D5D5DA25D5D5DA2157D15FDEC01F915
+F1EC03E11407EC0FC1EC1F811501143F147E14FC14F8EB01F01303EB07E014C0EB0F8013
+1FEB3F00133E5B13FC485A485A5B1207485A485A90C7FC123E127E5AB912FCA5C80003EB
+E000AD023FB612FCA536487DC73D>I<D8038015E001E0140301FC143F9039FFE003FF91
+B612C017801700A25E5E16F05E5E93C7FC15FC15F001E790C8FC01E0C9FCAAEC1FFC01E1
+B512C001E714F001EF14FC9039FFE01FFFDA0007138001FC6D13C001F06D13E04915F049
+7F17F8C913FC167F17FEA417FFA3EA0FC0EA3FF0487EA2487EA317FEA34914FF6C4815FC
+5B018015F86CC74813F07F6C6C4913E0D80FF04913C0D807FC011F13806CB46CB512006C
+90B512FC6C5D013F14C0010F91C7FC010113F030487AC63D>I<121F7F7F13FE90B812E0
+A45A18C0188018005F5FA25F485E90C8EA07E0007E4B5A5F007C151F4CC7FC167E5E485D
+15014B5A4B5AC8485A4B5AA24BC8FC157EA25D1401A24A5A1407A24A5AA2141FA24A5AA2
+147FA314FFA3495BA45BA55BAA6D5BA26D90C9FCEB007C334B79C93D>55
+D<93261FFF80EB01C00307B500F81303033F02FE13074AB7EAC00F0207EEE03F021F903A
+FE007FF87F027F01E0903807FCFF91B5C70001B5FC010301FC6E7E4901F0151F4901C081
+4949814990C97E494882494882485B48197F4A173F5A4A171F5A5C48190FA2485B1A07A2
+5AA297C7FC91CDFCA2B5FCAD7EA280A2F207C07EA36C7FA26C190F6E18807E6E171F6C1A
+006E5F6C193E6C6D177E6D6C5F6D6C4C5A6D6D15036D6D4B5A6D01F04B5A6D01FCED3FC0
+010001FFEDFF806E01E0D903FEC7FC021F01FEEB3FFC020790B612F002015EDA003F92C8
+FC030714FCDB001F13804A4D79CB59>67 D<B912F0F0FF8019F019FC19FFD8001F902680
+000114C0DD001F7F060713F806017F726C7E737E737F737F737F8587737F8587A2747EA3
+8786A21C80A51CC0A586A462A51C80A51C00A26263A2631AFF636163614F5B634F5B073F
+90C7FC4F5A4F5A06035B061F5B4DB512C0BBC8FC19FC19F0198006F0C9FC524B7CCA5E>
+I<BBFCA41A80D8001F01C0C7FC181F18038484197F193F191F1AC0190FA31907A4171FF1
+03E0A496C7FCA25FA25F5F5E160792B6FCA5EDC0071601828383A283A794C9FCB1B8FCA5
+434A7CC94D>70 D<B712FEA5D8000FEBE000B3B3B3ABB712FEA5274B7DCA2E>73
+D<B8FCA5D8001F01C0C9FCB3B3A4193EA4197E197CA519FCA31801A2F003F8A21807180F
+181F183F187FEF01FF1707173FBA12F0A53F4B7BCA4A>76 D<B600E04DB612806F5FA26F
+5FA2D8001F09FCC7FC6FEF0F7FA2DABFFE171EA2DA9FFF173CA3028F6D1678A202876D16
+F0A202836DED01E0A302816DED03C0A202806DED0780A26F6CED0F00A36F6C151EA26F6C
+5DA26F6D5CA26F6D5CA36F6D495AA26F6D495AA26F6D495AA3706C49C7FCA2706C131EA2
+706C5BA3706D5AA2706D5AA270EBE1E0A370EBF3C0A270EBFF80A27190C8FCA2715AA371
+5AA2715A497EB600F06D480103B71280A3715A715A694B7BCA74>I<B912C018FCF0FF80
+19F085D8001F902680000713FE05007F063F1380060F13C07213E01AF0841AF8A27213FC
+A31AFEA81AFCA34E13F8A21AF0601AE04E13C0063F138095B51200050713FC92B75A19E0
+96C7FC18F803C0CAFCB3ABB712FCA5474B7BCA54>80 D<B9FC18F8F0FF8019E019F8D800
+0F9026C0000713FE9439007FFF80061F7F727F727F727F84868684A286A862A24E5BA262
+4E5B4E5B4E5B4E5B95B5C8FC050713FC92B712F0198006FCC9FC18FF9226C0003F13C005
+0713F0717F717F717F187F85727FA28486A786A71C3E86A28474137E72157C726D13FCB7
+00FC6D9038FE01F872EBFF8373EBFFF0071F14E007031480CD383FFE00574C7CCA5C>82
+D<DA7FFCEB01C00103B5EAC003011FECF00749ECFC0F90B7121F48D9E00F13BF4890C713
+FFD807FC141F4848804848140382484880177F485A173F171F12FFA2170F7FA217077F7F
+7F6D92C7FC6D7E6C13F014FF15F86CECFF8016F86C15FF6C16C0836C826C826C826C8201
+3F816D1680010716C01300020F15E01400030714F0ED007F160F16037013F882177F1278
+00F8163FA3171FA27E18F0A27EA26CEE3FE07F18C001E0157F6DEDFF8001FC160001FF14
+0302E0EB0FFED97FFEEB3FFC486CB612F0D8FC0F5DD8F803158048C66C49C7FC48010313
+F0354D79CB44>I<B700F8023FB512F8A5D8001F01C0C9380FE000745AB3B3AD6D180F63
+811A1F6D96C7FC626D7F1A7E6D7F6D606E6C4B5A6E6CED07F06E6C4B5A6E01C0EC3FC06E
+01F049B45A020101FF011F90C8FC6E91B55A033F15F8030715E0030092C9FC040713F055
+4C7CCA5E>85 D<B700F00203B6FCA5D8001F01E0C93803FC00745A6D61811A036D6D5F1A
+076D6D5F1A0F6D616F161FA26D6D94C7FC626E6D153E1A7E6E177C7015FC6E5F8219016E
+6D5D19036E5F7014076E5F82190F6E6D5D191F6E6D92C8FC616F153E83197E6F6D137C19
+FC6F6D5B18016F5DEFF003A26F01F85B18076F01FC5B180F6F5DEFFE1F6F92C9FC17FF60
+7013BE18FE705BA2705BA3705BA2705BA2705BA3705BA27090CAFCA2177EA2584C7ECA5D
+>I<ECFFFC010FEBFFC0017F14F090B612FC489038803FFE3B03FC0007FF80486C6D7F6D
+7F486D6C7F83167F83A2707E6C90C7FC6C5A6C5AC9FCA5ED1FFF021FB5FC49B6FC130F01
+3FEBC03F9038FFFE00000313F04813C04890C7FC485A485AA2485AA2485AA4167FA26D14
+FF007F15EF6D01017F6C6C903907CFFF806C6CD90F8F13FE6C9038E07F076C9038FFFE03
+00014A7ED8003F9038F0007F0103018090C7FC37347CB23C>97 D<EB7FC0B5FCA512037E
+B3ED07FF037F13E002C1B512FC02C714FF9126CFF80F7F9126DFC0017F02FFC77F4AEC3F
+F002F8814A6E7E717E4A81831980A37113C0A319E0AC19C0A35F1980A219005F606E141F
+6E5D4D5A6E4A5A02BF4A5A91261FC0035B9027FE0FF01F5B496CB548C7FCD9F80114F849
+6C6C13E0C8D80FFEC8FC3B4D7CCB44>I<91380FFF8091B512F8010314FF010F15804948
+C613C0D97FF8EB1FE0D9FFE0EB3FF04849137F4849EBFFF84890C7FCA2485A121FA24848
+EC7FF0EE3FE0EE1FC0007F92C7FC5BA212FFAC127FA27FA2123FA26C6C153EA26C6C157E
+177C6C6D14FC6C6D14F86C6D13036C6DEB07F0D97FFCEB1FE06DB4EBFFC0010F90B51200
+01035C010014F0020F13802F347CB237>I<EF1FF0EE3FFFA51600177FB3EC0FFF91B512
+E0010314F8010F14FC013FEB01FF903A7FF8003FFFD9FFE0130F48497F48497F4890C77E
+48815B121F5B123FA2127F5BA312FFAC127FA36C7EA3121F6D5C120F6C6C5C6C6D5B6C5D
+6C01E0013F7F6D6C49EBFFE090393FFE03FE6DB512F801075C0100148091261FFC00EBC0
+003B4D7CCB44>I<EC0FFF91B512F0010314FC010F14FF90263FFE077F90267FF0007F49
+486D7E4801806D7E486F7E4890C7120F484881707E121F491403003F82A2127F5B701380
+A212FFA390B8FCA401F8CAFCA5127FA27FA2123FA26C6CED0F80A26C6C151F6C17006E5C
+6C6D147E6C6D5C6C6D495AD93FFCEB07F0903A1FFF803FE0010790B55A010192C7FC6D6C
+13FC020713C031347DB238>I<DA7FFCEB0FE00103B538807FF8010F9138E1FFFC013F02
+FB13FE903A7FF01FFFF39026FFC007138348D90001130348168348486DEBC1FCEFC0F800
+0FEEE00049147F001F82A9000F5E6D14FF00075EA26C6C495B6C93C7FC6C9038C007FE91
+38F01FFC4890B55A01EF14E0D803C314809026C07FFCC8FC000790CAFCA47FA27F13FC90
+B612FCEEFFC06C16F817FE6C8218806C17C06D16E00003B812F0120FD81FFCC7000F13F8
+D83FF0140049153F4848ED1FFC00FF160F491507A56D150F007F17F86D151F6C6CED3FF0
+6C6CED7FE0D80FFE913801FFC06C6C6C010713806C01F8017F1300C690B612FC013F15F0
+01071580D9003F01F0C7FC37497DB13D>103 D<13FCEA03FF487F487FA2487FA66C5BA2
+6C5B6C90C7FCEA00FC90C8FCABEB7FC0B5FCA512037EB3B3A2B61280A5194D7BCC22>
+105 D<EB7FC0B5FCA512037EB3B3B3AAB61280A5194C7BCB22>108
+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>I<D97FE0EC3FF0B5EC7FFFA5000315016C81B3AC5EA25E
+A25E7E6EEB0F7F017F021E7F6E017CEBFFE090393FFE01F86DB512F0010714E0010114C0
+9027003FFE00EBC0003B337BB144>I<007FB500C090387FFFE0A5C601F0C73803F8006E
+5D017F5E6E1407013F5E80170F011F5E6E141F6D93C7FC6F5B6D153E6F137E6D157C6F13
+FCA26D6D5B16016D5DEDF803027F5CEDFC07023F5CEDFE0F021F5C15FF161F6E91C8FC16
+BF6E13BE16FE6E5BA26E5BA36E5BA26F5AA26F5AA26F5AA393C9FC5D153E157E157CD81F
+8013FC486C5B387FE001D8FFF05B14035D14074A5A49485A007F133F4948CAFC383F81FE
+381FFFF86C5B6C13C0C648CBFC3B477EB041>121 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fj cmr8 8 6
+/Fj 6 100 df<B512C0A412047F9018>45 D<DA1FF013C09138FFFE01903903F00F8390
+390F8001E3013FC71277017C143F4848141F4848140F48481407A248481403121F491401
+123F90C8FC481500A300FE1600AB127F17C0A27E7F001F15016D1580120F6C6C1403EE07
+006C6C14066C6C140ED8007C5C013F147890390F8001E0903903F00FC0902600FFFEC7FC
+EC1FF02A2F7CAD33>67 D<B712FEA23903F800010001EC003E828282A282A31780160115
+18A293C7FCA31538157815F890B5FCA2EBF800157815381518A21760A392C712C0A41601
+17801603A21607160F163F0003913801FF00B8FCA22B2D7EAC30>69
+D<B612C015FC3903F8007F0001EC0FC06F7E6F7E6F7E82150082A55E15015E4B5A4B5A4B
+5A037FC7FC90B512FC15F09038F800FC153E6F7E150F826F7EA582A5170316F815031707
+486C903801FC0EB539F000FE1CEE3FF8C9EA07E0302E7DAC34>82
+D<007FB712F8A29039000FC003007C150000701638A200601618A200E0161CA248160CA5
+C71500B3A94A7E011FB512E0A22E2D7EAC33>84 D<EB1FE0EB7FFC3801F01E3803E00739
+07C01F80EA0F80EA1F005A003EEB0F00007E90C7FCA2127C12FCA9127EA215C07E6C1301
+01801380380FC0033907E007003801F03E38007FF8EB1FC01A207E9E1F>99
+D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fk cmsy9 9 2
+/Fk 2 106 df<EB0180EB03C01307A21480130FA2EB1F00A2131E133EA25BA2137813F8
+A2485AA25B1203A2485AA25B120FA248C7FCA2121E123EA25AA2127812F8A41278127CA2
+7EA2121E121FA26C7EA212077FA26C7EA212017FA26C7EA21378137CA27FA2131E131FA2
+EB0F80A2130714C0A21303EB0180124A79B71E>104 D<126012F07EA21278127CA27EA2
+121E121FA26C7EA212077FA26C7EA212017FA26C7EA21378137CA27FA2131E131FA2EB0F
+80A2130714C0A41480130FA2EB1F00A2131E133EA25BA2137813F8A2485AA25B1203A248
+5AA25B120FA248C7FCA2121E123EA25AA2127812F8A25A1260124A7CB71E>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fl cmtt12 17.28 6
+/Fl 6 118 df<ED7FF00203B5FC021F14E0027F14F849B67E4915FF010F824982498249
+EBC01F9027FFFE00037F4801F801007F48496E7E02C0143F48496E7E4890C8120F491507
+001F8349815B003F18804981A2127F4917C08312FF90B9FCA71980190001C0CBFC7F127F
+A37F123F7FA26C6C163F6DEE7F806C6CEEFFC0A26C6D5C14E06C6D4A13806C01FC5C6C6D
+021F130090267FFFC05B6D9039F801FFFE6D90B65A6D5E6D5E6D5E01005E023F92C7FC02
+0F14FC020114E09126001FFEC8FC3A4179BF4A>101 D<EE1FFC263FFFF090B57E48D9F8
+0714E0DAFC1F14F8B5498092B67E14FD6C90B8FC856CEDE01FD8000FDA00077F03FC7F4B
+7F4B7F4B815D4B147FA292C8FCA25CA45CB3AC003FB690B612F848038115FCA2B700C315
+FEA36C038115FCA26C030015F8473F7FBE4A>110 D<EF0FFE003FB591B512C048DA8003
+14F0B6D8C00F14F8043F14FC93B6FC03C115FE15C36C14C76C02CFEBF80FC701DF13C092
+B5380007FC04FCEB03F84CEB01F004E090C7FC5E5E93C9FC5DA25DA25DA25DA25DA45DB3
+A6003FB712F84882B8FC83A35F7E6C5E3F3F7BBE4A>114 D<913A1FFF800F800103B5EA
+F81F011F9138FF3FC0017F15FF48B8FC5A5A5A5A48EBE00049C7121FD87FF880491403D8
+FFC080A25B82A37FEF7F806C7E01F892C7FC13FE383FFFC06C13FE6CEBFFF86CECFFE06C
+15FC6CEDFF806C6C15F0011F81010315FED9007F8002011580DA000F14C0DB003F13E016
+07040113F0D83F809138007FF8007F163F486CED1FFC170F7F1707A27FA26D150FA27F6D
+ED1FF86D157F02C0ECFFF06E130302FC013F13E091B712C0A2188001BF1600019F15FC01
+0F15F0010315C0267E007F49C7FC007C010713E0364176BF4A>I<EC0FC04A7E4A7EAF00
+3FB812FC4883BAFCA56C5F6C5FC7D83FF0C9FCB3ABF00FC0F01FE0F03FF0A76F147FA2F0
+FFE06E6C5B6F4913C06F5B6ED9E03F138093B61200806E5D6E15F86E5D6F5C6F1480030F
+01FCC7FC030013C03C507DCE4A>I<263FFFF049B57E486D49806E82B55CA36C81A26C81
+D8000F91C7127FB3B118FFA35F5F6E5C5F6E5C6D6D137FDBF003B612F86D90B812FCA26D
+18FE7F6E4A7E6E02FC14FC6EECE03F0207DA801F13F89126007FF8C9FC473F7FBD4A>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fm lcircle10 10 4
+/Fm 4 12 df<EA7FC0EAFFFEEBFFE06C13FCC66CB4FC010313C09038003FF0EC07FCEC01
+FE9138007F80ED1FC0ED07F06F7EED00FC167E82707E707E707E707E1601707E83177C83
+A2831880170FEF07C0A2170318E0A2170118F0A2170018F8A21878A4187CA2183CA71818
+3636B28364>8 D<1818183CA7187CA21878A418F8A218F01701A218E01703A218C01707
+A2EF0F80171F1800173EA25F17FC5F4C5A16034C5A4C5A4C5A4CC7FC167E5EED03F84B5A
+ED1FC0ED7F80DA01FEC8FCEC07FCEC3FF0903803FFC0017F90C9FC387FFFFCB512E049CA
+FCEA7FC03636B2B564>I<126012F0A77EA21278A3127CA2123C123EA2121E121FA27E7F
+A26C7E7F12036C7EA26C7E7F137E133E7F806D7E6D7E6D7E6D7E6D7E147F6E7EEC0FC0EC
+07F0EC03FCEC00FFED7FC0ED1FF8ED07FF030113FC9239007FFFF8040F13FC1601933800
+07F8363680B564>I<EF07F8933801FFFC160F047F13F8923901FFFC00030790C7FCED1F
+F8ED7FC04BC8FCEC03FCEC07F0EC0FC0EC3F804AC9FC14FC495A495A495A495A495A91CA
+FC133E137E5B5B485AA2485A12075B485AA290CBFC5AA2121E123EA2123C127CA21278A3
+12F8A25AA712603636808364>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fn cmti10 10.95 37
+/Fn 37 122 df<933807FF80043F13E09338FE00F8DB01F0133EDB07E0130E4B48131F4C
+137F031F14FF4BC7FCA218FE157E1878180015FE5DA31401A25DA414030103B712F0A218
+E0903A0003F000070207140F4B14C0A3171F020F15805DA2173F1800141F5D5F177EA214
+3F92C712FE5FA34A1301027EECF81CA3160302FEECF03C4A1538A21878187013014A0101
+13F018E0933800F1C0EF7F804948EC1F0094C7FCA35C1307A2001E5B127F130F00FF5BA2
+49CAFC12FEEAF81EEA703CEA7878EA1FF0EA07C0385383BF33>12
+D<EA01E0EA07F8120FA2EA1FFCA4EA0FF8EA0798EA001813381330A21370136013E013C0
+1201EA0380EA07001206120E5A5A5A5A5A0E1C7A891C>44 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 D<EEFFC0030713F892383F80FE9238FC003FDA03F0EB0F804A486D
+7EDA1F80804AC76C7E027E6E7E4A81494814004948811307495A4948157F133F5C49C9FC
+4917805B1201485AA212075B000F17FFA25B121F190048485DA448484B5AA34D5AA25B4D
+5A12FF60171F60007F163F604D5AA24DC7FC5F003F15014C5A6D5D001F4B5A4C5A6C6C4A
+5A4C5A6C6C4AC8FC000315FC6C6C495A6C6CEB07E0017FEB1F8090261FC07EC9FC903807
+FFF801001380394273BF46>79 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 D<EB1FC0EA0FFF5CA2EA003F
+A291C7FCA25BA2137EA213FEA25BA21201A25BA21203A25B147E3907F1FF809038F783E0
+9038EF01F013FE390FF800F8A24913FC49137C485A157E5B15FE123FA290C7FCA2481301
+15FC127EA2140300FE14F85AA2EC07F0A215E048130F15C0141F15800078EB3F00127C14
+7E003C5B383E01F8381E03E06C485A6CB4C7FCEA01F81F4076BE2A>I<EC1FE0ECFFF890
+3803F03E903807C00F90381F8007D93F001380017E131F49137F485A485A000715005B00
+0F147E484890C7FCA2485AA3127F90C9FCA35A5AA6481403007E5C5D151E003E5C5D6C5C
+EC03E0390F800F802603E07EC7FC3801FFF838003FC0212977A72A>I<EE3F80ED1FFF17
+00A2ED007FA2167EA216FEA25EA21501A25EA21503A25EA21507A25E147E903801FF8F90
+3807C1CF90391F80EFC090383F00FF017E137F5B48486D5A485AA2485A000F92C7FC5B00
+1F5CA24848137EA215FE127F90C75AA214015A485CA2140316384814F0A2140716789138
+0FE070127C021F13F0007E013F5B003E137FECF3E1261F01E35B3A0F8781E3802703FF00
+FFC7FCD800FC133E294077BE2E>I<EC3F80903801FFE0903807E0F890381F803CEB3E00
+01FC131E485A485A12074848133E49133C121F4848137C15F8EC03F0397F000FE0ECFF80
+B5EAFC0014C048C8FCA45AA61506150E151E007C143C15786C14F0EC01E06CEB07C0390F
+801F003807C0FC3801FFF038007F801F2976A72A>I<167C4BB4FC923807C78092380F83
+C0ED1F87161FED3F3FA2157EA21780EE0E004BC7FCA414015DA414035DA30103B512F8A3
+90260007E0C7FCA3140F5DA5141F5DA4143F92C8FCA45C147EA414FE5CA413015CA4495A
+A4495AA4495A121E127F5C12FF49C9FCA2EAFE1EEAF83C1270EA7878EA3FE0EA0F802A53
+83BF1C>I<EC03F0EC0FFC91383E0E1C9138FC077E903901F003FE1303903807E001D90F
+C013FCEB1F80A2EB3F004914F8137E01FE1303A2484814F0A2150712034914E0A2150F12
+074914C0A2151FA216805B153F1203ED7F006D5BA200015B0000495A9038F80F7E90387C
+1EFEEB1FF8903807E0FC90C7FC1401A25DA21403A25D001C1307007F5C48130F5D4A5A4A
+C7FC48137E00F85B387C03F0381FFFC0D803FEC8FC273B7CA72A>I<EB01FC13FF5CA213
+03A25CA21307A25CA2130FA25CA2131FA25CA2133FA291C8FCEC03F890387F0FFE91383E
+0F80D97E7813C0ECE007D9FFC013E014801400A2485A5BA25B0003140F16C05BA2000714
+1F16805BA2000F143F16005B5D001F147EEDFE074913FCA2003F0101130FEDF80E130016
+1E48ECF01CA2007E1538A200FE1570020013E048EC7FC00038EC1F0028407ABE2E>I<14
+78EB01FCA21303A314F8EB00E01400AD137C48B4FC38038F80EA0707000E13C0121E121C
+EA3C0F1238A2EA781F00701380A2EAF03F140012005B137E13FE5BA212015BA212035B14
+38120713E0000F1378EBC070A214F0EB80E0A2EB81C01383148038078700EA03FEEA00F8
+163E79BC1C>I<EB01FC13FF5CA21303A25CA21307A25CA2130FA25CA2131FA25CA2133F
+A291C8FCED03E049EB0FF8ED3C3C017EEB707CEDE1FC9038FE01C1EC03839038FC070314
+0E0001011C13F891383800E0494813001460000313E0EBF9C0EBF78001FEC8FC1207EBFF
+E0EBE7F8EBE0FE000F137F6E7EEBC01F6E7E121F16701380A2003F15F0021F13E0010013
+80A248148116C0007EEB0F83168000FE14879138078F0048EB03FE0038EB00F826407ABE
+2A>107 D<EB07F0EA03FF14E0A2EA000FA214C0A2131FA21480A2133FA21400A25BA213
+7EA213FEA25BA21201A25BA21203A25BA21207A25BA2120FA25BA2121FA25BA2123FA290
+C7FCA25A1307127EA2EAFE0F130E12FCA2131E131CA2EA7C381378EA3C70EA1FE0EA0780
+144079BE17>I<D801F0D93F80137F3D07FC01FFE003FFC03D0F3E07C1F80F83F03D0E1F
+0F00FC1E01F8001E011C90387C3800001C49D97E707F003C01F05C0038157F4A5C26783F
+C05C12704A91C7FC91C7127E00F003FE1301494A5CEA007EA20301140301FE5F495CA203
+031407000160495C180F03075D0003051F13E0494A1480A2030FEC3F810007F001C0495C
+A2031F91383E0380120F494AEC0700A2033F150E001FEF1E1C4991C7EA0FF80007C7000E
+EC03E0432979A74A>I<D801F0EB3F803A07FC01FFE03A0F3E07C1F83A0E1F0F00FC001E
+011C137C001C49137E003C13F012385C38783FC012705C91C7FC00F015FE495CEA007EA2
+150101FE5C5BA2150300015D5B15075E0003020F13704914C0A2031F13F00007ED80E05B
+1681EE01C0120F49EC0380A2EE0700001FEC0F0E49EB07FC0007C7EA01F02C2979A733>
+I<EC1FC0ECFFF8903803F07C90380FC01FEB1F8090393F000F80017E14C0491307484814
+E0485A12075B000F15F0485AA2485AA2ED0FE0127F90C7FCA2151F4815C05AA2ED3F80A2
+ED7F00A248147E007C5C007E13015D4A5A003E495A6C495A4A5A260F803EC7FC3807C0FC
+3801FFF038003F80242977A72E>I<903903E001F890390FF807FE903A1E7C1E0F80903A
+1C3E3C07C0013C137801389038E003E0EB783F017001C013F0ED80019038F07F0001E015
+F8147E1603000113FEA2C75AA20101140717F05CA20103140F17E05CA20107EC1FC0A24A
+1480163F010F15005E167E5E131F4B5A6E485A4B5A90393FB80F80DA9C1FC7FCEC0FFCEC
+03E049C9FCA2137EA213FEA25BA21201A25BA21203A2387FFFE0B5FCA22D3A80A72E>I<
+D801F013FC3A07FC07FF803A0F3E0F03C0260E1F1C13E0001EEB380F001C1370003CEBE0
+1F123814C0D8783F14C00070903880070092C7FC91C8FC12F05BEA007EA313FE5BA31201
+5BA312035BA312075BA3120F5BA3121F5B0007C9FC232979A726>114
+D<EC7F80903801FFE0903807C0F890381F003C013E131C013C131E017C133E49137E15FE
+A2000114FCA215706D13007FEBFFC014FC6C13FF15806D13C06D13E0010F13F01300140F
+14071403120C123F387F80011403D8FF0013E0A300FCEB07C000F0EB0F8012700078EB1F
+006C133C381F01F83807FFE0C690C7FC1F297AA725>I<EB01C0EB03F01307A25CA2130F
+A25CA2131FA25CA2133FA291C7FCA2007FB51280B6FC1500D8007EC7FC13FEA25BA21201
+A25BA21203A25BA21207A25BA2120FA25BA2121F141C1380A2003F133C1438EB00781470
+14F05C495AEA1F03495A6C48C7FCEA07FCEA01F0193A78B81E>I<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 df<DB1FF8EB01804AB5EA8003020FECE007913A3FF803F80F9139FF80007C
+4948C7EA1E1FD907FCEC0FBFD90FF0EC07FF49488049488049488049C9127F4848163F12
+0349161F12074848160FA2485A1807123F5B1803127FA34993C7FC12FFAB0407B512FE12
+7F7FDC000113C09438007F80123FA27F121FA26C7EA26C7E12037F6C7E7E6D6C15FF6D7E
+6D6C5C6D7ED907FCEC03DFD901FFEC0F8F6D01C0EB3F07913A3FF801FC03020FB5EAF001
+020102C0C7FC9126001FFCC8FC3F427ABF4D>71 D<B56C91387FFFFC8080D8007F030313
+806E913800FE006E157C1838EB77FCEB73FE80137101707F6E7EA26E7E6E7EA26E7E6E7E
+A26E7E6E7EA26E7F6F7EA26F7E6F7EA26F7E6F7E8215036F7E6F1380A2EE7FC0EE3FE0A2
+EE1FF0EE0FF8A2EE07FCEE03FEA2EE01FF7013B8A2EF7FF8173FA2171F170F1707A21703
+01F81501487ED807FF1500B500F81578A218383E3E7BBD4A>78 D<B600C090387FFFFCA3
+000101E0C70003138026007F80913800FE00187C1838B3B3A4013F16786E1570A218F001
+1F5E6E1401010F5E6D6C1403606D6C14076D6C4AC7FC6D6C141E027F147C91393FC001F8
+91390FF00FE00203B55A020049C8FCED1FF03E407BBD4A>85 D<EC01E0A24A7EA34A7EA3
+4A7EA24A7E141CA2EC3CFFEC387FA24A6C7EA34A6C7EA2010180ECC00FA249486C7EA349
+486C7EA24980010E1301010FB5FC4980A2011CC7FC49147FA20178810170143FA201F081
+49141F1201486C811207486CEC3FF8D8FFFE49B512C0A332317DB038>97
+D<B612FEEDFFC016F03A03FC0007F86C48EB01FE1500167F1780163F17C0A61780167F17
+0016FE4B5AED07F0ED7FE090B6128016F09039F80001FC6F7EEE7F80163FEE1FC017E016
+0F17F0A617E0161FA2EE3FC0EE7F80923801FF00486CEB07FEB712F85E93C7FC2C2F7CAE
+35>I<DA0FF81330DA7FFF13700103B5EAC0F090390FFC03F190391FE000F9D97F80133F
+01FEC7121F4848140F48481407485A000F1503491401121F491400123F5B127F1770A248
+C9FC1700AA6C6C1570A3123F6D15F0121F6D15E0000F15016D15C0000715036C6C15806C
+6C14076C6CEC0F00D97F80133ED91FE05B90390FFC03F00103B55AD9007F1380DA0FF8C7
+FC2C317BAF36>I<B612FEEDFFE016F83A03FE0007FC6C48EB00FFEE3F80707E707E707E
+707E160183160083A2177FA41880AA1800A317FEA34C5A5F16034C5A5FEE1FC04C5A04FF
+C7FC486CEB07FEB712F816E093C8FC312F7DAE39>I<B81280A3D803FEC7FC6C48EC1FC0
+160F16071603A21601A317E0ED0E00A31700A2151E153E157E90B512FEA39038FC007E15
+3E151E150EA21738A392C71270A417F0A2EE01E0A216031607161F486C14FFB812C0A32D
+2F7DAE33>I<B8FCA33903FE00016C489038003F80161F160F1607A21603A317C0160115
+0EA293C7FCA3151E153E157E90B512FEA39038FC007E153E151E150EA592C8FCAA487EB5
+12FCA32A2F7DAE31>I<DA0FF81360DAFFFE13E00103EBFF8190390FF807E390393FC000
+F34948137F01FEC7123F4848141F4848140F48481407120F491403485A003F1501A25B00
+7F1500A348C9FC1700A8031FB5FCA26C7E9238001FF0EE0FE0123F7FA26C7E120F7F1207
+6C7E6C7E6C6C141FD97F80133FD93FE0137B90390FFC03F10103B512E00100EC8060DA0F
+FCC7FC30317BAF3A>I<B512F8A33803FE006C5AB3B3A3487EB512F8A3152F7DAE1B>105
+D<D8FFFE923807FFF0A3D803FF92380FFC006C5FD9DF80141DA3D9CFC01439A2D9C7E014
+71A3D9C3F014E1A2D9C1F8EB01C1A3D9C0FCEB0381A2027EEB0701A36E130EA291381F80
+1CA391380FC038A2913807E070A3913803F0E0A3913801F9C0A2913800FF80A3486CEB7F
+00487E486C013E497EB5008091B512F0A2151C3C2F7CAE44>109
+D<D8FFFC91387FFFC07F7F0001923807FC006E6D5A6E6D5AD9DFE06D5AA2EBCFF0EBC7F8
+EBC3FCA2EBC1FEEBC0FF6E7EA26E7E6E7EA26E7E6E7E6E7EA26E7E6E7EED7F80A2ED3FC0
+ED1FE0ED0FF0A2ED07F8ED03FCA2ED01FEED00FF167FA2163F161F160F487E486C140748
+6C1403B56C1301A21600322F7DAE38>I<EC1FF891B5FC903907F00FE090390FC003F001
+3FC712FC017E147E49804848EC1F804848EC0FC04848EC07E0000F16F0491403001F16F8
+491401003F16FCA2007F16FE90C9FCA34816FFAA6C6CEC01FEA3003F16FCA26D1403001F
+16F86C6CEC07F0A26C6CEC0FE0000316C06C6CEC1F806C6CEC3F00017E147E6D5C90390F
+C003F0903907F00FE00100B5C7FCEC1FF830317BAF3A>I<B612FEEDFFC016F03A03FE00
+07FC6C48EB01FEED007FEE3F80A2EE1FC0A217E0A617C0A2EE3F80A2EE7F00ED01FCED07
+F890B612E0168001FCC9FCB2487EB512F8A32B2F7DAE33>I<90383FC00C9038FFF81C00
+03EBFE3C390FE03FFC381F8007EB0003003E1301481300157C5A153CA36C141CA27E6C14
+006C7E13E013FE383FFFE06C13FE6CEBFF806C14E0000114F06C6C13F8010F13FC1300EC
+07FE14011400157F153F12E0151FA37EA2151E6C143E6C143C6C147C6C14F89038C001F0
+39FBF807E000F1B512C0D8E07F130038C007FC20317BAF2A>115
+D<007FB712F8A39039801FF0073A7E000FE00000781678A20070163800F0163CA348161C
+A5C71500B3A8EC3FF8011FB512F0A32E2E7CAD36>I<B500F890387FFFC0A3D803FEC738
+07FC006C486E5A705A705AB3AB000015016D5D1603017E5D017F14076D6C49C7FC131F6D
+6C133ED907F05B903903FC03F00100B55A023F1380DA07FCC8FC32307DAE38>I<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 df<EEFF80030F13F092383FC0789238FE001CDA03F8130E4A48133FDA1FE0
+13FF4A5A4B5AEC7F005C5CEE00FE010115784A1400A513035CA4EE01FC0007B7FC17F8A2
+3A0007F0000F1607A2130F4A14F0A4160F131F4A14E0A4161F133F4A14C0A4163F137F91
+C71380A4167F5B491500A31201486C903801FF80B5D8F83F13FC5DA230407EBF33>12
+D<007FB5FCA2B512FEA418067C961E>45 D<13F0EA01FC1203EA07FEA313FCA2EA03F8EA
+01E0C7FCB3121EEA3F80EA7FC012FFA41380EA7F00123C0F2778A619>58
+D<17E016011603831607A2160FA2161F83163FA2167F167716F7EEE7FCED01E316C31503
+16831507EE03FEED0F01150E151E151C153C03387FED7800157015F05D4A4880177F4A5A
+A24AC7FCA2020E81173F5C021FB6FC5CA20270C7EA3FE0171F5CA2495AA2494881170F49
+C8FCA2130EA24982013C1507A2137CD801FE4B7E2607FF80EC3FFEB500F00107B512FC19
+F85E3E417DC044>65 D<013FB7FC18E018FC903B007FE00007FE6E48903801FF80943800
+7FC05DF03FE0F01FF0A3027F16F892C8FCA54A16F04A153F19E0187F19C0F0FF8001014B
+13004A4A5A4D5AEF1FF04D5ADC03FFC7FC49B612F8EFFF8002F8C7EA3FE0EF0FF0EF07FC
+717E010715014A81711380A319C0130F5CA5011F4B13805C19005F601707013F4B5A4A4A
+5A4D5A4D5A017F913801FF8001FF020F90C7FCB812FC17F094C8FC3D3E7DBD40>I<DCFF
+C01338030F01F01378037F01FC13F0913A01FF803F01913A07FC000781DA1FE0EB03C3DA
+7FC0EB01E74AC812FF4948ED7FE0D907FC153F495A4948151F495A4948150F494816C018
+074890C9FC485AA2485A000F1880491603121FA248481607A295C7FC485AA412FF5BA75B
+A2181C183C1838A27F007F1778187018F0003F5F6D150160001F16036C6C4B5A95C7FC6C
+6C5D6C6C151E6C6C5D6C6C15F86D6C495A6D6CEB07C0D91FF0EB1F80D907FE01FEC8FC01
+01B512F86D6C13E0DA07FEC9FC3D4276BF42>I<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
+>I<B600E090B512FC4B15F8A2000101C0C7000F13006C49EC03FCEF01F091C9FC60A317
+015A495EA417031203495EA4170712074993C7FCA45F120F49150EA4171E121F49151CA4
+173C123F491538A31778177017F05F001F15015F16036D4A5A000F93C8FC5E6C6C141E6C
+6C5C000115F86C6C495A017FEB07C090393FC03F8090260FFFFEC9FC010313F89038007F
+C03E4073BD44>I<B6017FB5D88007B512804A1A00A2000701C0010101E0C713F06C90C8
+0180EC3FC06C48735A99C7FC057F150E1B1E6D191C6C1A3C1B3805FF15787214705E636E
+EB03BF017F4E5AEE073F505A040E7F051F4AC8FC161C6E170E013F143862167804706D5B
+EEF00F04E05D90381FE00104C015F003035E0480140106F85B9226070007130302F05F01
+0F010E150797C9FC5D190E4BEB03FC616E5A01075F5D61DAF9C014FE05015BECFB8002FF
+6F5A7F92C75CA24A93CAFC835C606D5A605C604A15781870594074BD5D>87
+D<EC7FC0903803FFF890380FC07E90383E003F496D7E01FF6D7E82A248140782A26C5A13
+7890C7120FA25EA2EC03FF147F903807FF1FEB1FE0D97F805B3801FE00EA03F8485A4848
+133F485A003F5D49EC81C048C7FCA2157F48ED03804814FFA2007F5B913903BF07009038
+80073F3A3FC00E1F8E260FE03C13FC3A03FFF00FF83A007FC003E02A2A7CA82D>97
+D<EB3F80EA1FFFA3C6FC137FA291C9FCA55B5BA512015BA4EC07F80003EB3FFF9039F8F8
+0FC09039FBE003E09039FF8001F891C77E5B4848147E49147F5B821780A2120F5B17C0A3
+167F001F16805BA4EEFF00123F5B4B5AA24B5A5E007F4A5AA24B5A6D495A4BC7FCD87CE0
+137E39F87001F839F03C07E039E00FFF80260003FCC8FC2A4077BE33>I<EC1FF0ECFFFE
+903903F01F8090390FC003C0D93F0013E0017E130F49131F000115F04848EB3FE0485AA2
+4848EB1FC0001FEC0F004990C7FC123FA2485AA412FF90C9FCA96CEC0380150716006C6C
+5B151E001F5C6C6C5B6C6C5B6C6C485A3901F80F8026007FFEC7FCEB0FF0242A7AA828>
+I<EE03F8ED01FFA3ED000F1607A217F0A4160FA217E0A4161FA217C0A491380FF03FECFF
+FC902603F81F138090390FC007BF90391F8003FF90387E0001497F0001157F4848150048
+5A120F5B001F5D485A5E5B127FA2150112FF90C75BA41503A25EA37E1507A26C4A5A7F00
+1F141F6C6C133F6C6CEBFFF83B03F001EFFFC03900F80F8F90383FFE0FD90FF0EBE0002D
+407ABE33>I<EC3FE0903801FFF8903807E07E90380F801F90393F000F80017E14C049EB
+07E0485A12034848EB03F0485AA2121F5B123FA248481307A290B6FCA2D8FF80C8FC90C9
+FCA87EED01C015036C15806D1307001FEC0F006D131E000F5C6C6C5B6C6C485A3900FC07
+C0D93FFFC7FCEB07F8242A7BA828>I<ED07F0ED3FFCEDFC1E913803F03F4A48B4FC4A48
+1380141FEC3F81DA7F0113008102FE137C93C7FCA213015CA513035CA50007B512F8A326
+0007F0C8FCA3130F5CA5131F5CA5133F5CA5137F91C9FCA55B5BA4EA03FF007F13FEB5FC
+A229407DBF1C>I<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>I<EC0FF0ECFFFE903903F01F8090390FC007C049C6
+6C7E013E6D7E01FC6D7E48488049147C0003157E485A000F157F5B121FA2485AA2007F16
+80A2170048C85AA54B5AA25E5A6C4A5A7E4B5A5E6C140F6C6C5C4B5A6C6C013EC7FC6C6C
+5B6C6C485A3900FC0FE090383FFF80D90FF8C8FC292A7BA82D>I<91387F01FE903A7FFF
+0FFFC09139FE3E03F09238F801F8903A01FFE000FE4B137F6D497F4990C713804A15C04A
+141FA218E0A20103150F5C18F0A3171F010716E05CA3173F18C0130F4A147F1880A2EFFF
+004C5A011F5D16034C5A6E495AEE1FC06E495AD93FDC017EC7FC91388F01F8913883FFE0
+028090C8FC92C9FC137FA291CAFCA45BA25BA31201487EB512F8A3343A81A733>I<9039
+07F01F80D803FFEB7FE09138E1E1F09138E387F839001FE707EB0FE614EE02FC13F002D8
+13E09138F801804AC7FCA25C131FA25CA4133F5CA5137F91C8FCA55B5BA31201487EB512
+FEA325287EA724>114 D<9138FF81C0010713E390381F807F90397C003F8049131F4848
+130F5B00031407A248481400A27FA27F6D90C7FCEBFF8014FC6C13FF6C14C015F06C6C7F
+011F7F13079038007FFE1403140100381300157EA2123C153E157E007C147CA2007E1478
+15F8007F495A4A5A486C485A26F9E01FC7FC38E0FFFC38C01FE0222A7DA824>I<EB0380
+A4130791C7FCA25BA25BA2133EA2137E13FE12011207001FB512C0B6FCA2D801FCC7FCA3
+12035BA512075BA5120F5BA41407001F130E13C0A4141E141C1380A26D5AA2000F5B14F0
+3807E1E03801FF80D8007EC7FC1A3978B723>I<01FE147F00FFEC7FFF4914FEA2000714
+0300031401A34914FCA4150312074914F8A41507120F4914F0A4150F121F4914E0A2151F
+A3153F4914C0157F15FFEC01DF3A0FC003BFE09138073FFF3803F01E3801FFF826003FE0
+1380282977A733>I<B539E007FFF05D17E02707FE000313006C48EB01FC6F5A5E00014A
+5A5EA24B5A6D1307000092C7FC5D150E6D5B7F5DA25D1480013F5B14815D14C3011F5B02
+C7C8FCA214CE14EEEB0FFCA25CA26D5A5CA25CA26D5A2C2878A630>I<B500C3B53803FF
+FCA204FE14F8290FFE003FE00013C0D807F86D48EB7F000003173E183C150F18386D5E00
+01141F705B153F4D5A15776D4B5A0000ECE7F04DC7FCEC01C3170E9038FF0383017F5D91
+380703F85FEC0E01021E5CD93F9C14F002BC6D5A02B813FDDAF8005B4A13FF5F6D5A94C8
+FC5C4A137E167C6DC7FC1678010E14383E2878A642>I<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>I<EA07C0EA0FF0
+EA1FF8A213FCA213FE120F1207EA007EA513FE13FCA2120113F81203EA07F0120FEA1FE0
+127FEAFFC013801300127C12380F1D70B730>39 D<141E147F14FF5BEB03FEEB07FCEB0F
+F0EB1FE0EB3FC0EB7F80EBFF00485A5B12035B485A120F5BA2485AA2123F5BA2127F90C7
+FCA412FEAD127FA47F123FA27F121FA26C7EA27F12076C7E7F12017F6C7EEB7F80EB3FC0
+EB1FE0EB0FF0EB07FCEB03FEEB01FF7F147F141E184771BE30>I<127812FE7E7F6C7E6C
+7EEA0FF06C7E6C7E6C7E6C7EEB7F80133F14C0131FEB0FE014F01307A2EB03F8A214FC13
+01A214FE1300A4147FAD14FEA4130114FCA2130314F8A2EB07F0A2130F14E0EB1FC0133F
+1480137FEBFF00485A485A485A485AEA3FE0485A485A90C7FC5A1278184778BE30>I<14
+E0497E497EA60038EC0380007EEC0FC0D8FF83EB3FE001C3137F9038F3F9FF267FFBFB13
+C06CB61280000FECFE00000314F86C5C6C6C13C0011F90C7FC017F13C048B512F0488000
+0F14FE003FECFF80267FFBFB13C026FFF3F913E09038C3F87F0183133FD87E03EB0FC000
+38EC0380000091C7FCA66D5A6D5A23277AAE30>I<143EA2147FAF007FB7FCA2B81280A3
+6C1600A2C76CC8FCAF143EA229297DAF30>I<EA03E0EA0FF0EA1FF813FCEA3FFEA213FF
+A27EA27E1203EA007FA2137E13FEEA01FC1203EA07F8EA3FF0127FEAFFE0EA7F80130012
+3C1019708B30>I<007FB612F0A2B712F8A36C15F0A225077B9E30>I<120FEA3FC0EA7FE0
+A2EAFFF0A4EA7FE0A2EA3FC0EA0F000C0C6E8B30>I<16F01501ED03F8A21507A2ED0FF0
+A2ED1FE0A2ED3FC0A2ED7F80A2EDFF00A24A5AA25D1403A24A5AA24A5AA24A5AA24A5AA2
+4A5AA24AC7FCA2495AA25C1303A2495AA2495AA2495AA2495AA2495AA249C8FCA2485AA2
+5B1203A2485AA2485AA2485AA2485AA2485AA248C9FCA25AA2127CA225477BBE30>I<14
+FE903807FFC0497F013F13F8497F90B57E48EB83FF4848C6138049137F4848EB3FC04848
+EB1FE049130F001F15F0491307A24848EB03F8A290C712014815FCA400FEEC00FEAD6C14
+016C15FCA36D1303003F15F8A26D1307001F15F0A26D130F6C6CEB1FE0A26C6CEB3FC06C
+6CEB7F806D13FF2601FF8313006CEBFFFE6D5B6D5B010F13E06D5BD900FEC7FC273A7CB8
+30>I<EB03C0497EA2130FA2131FA2133F137F13FF1203123FB5FCA213EF138FEA7E0F12
+00B3B0003FB512F84814FCB612FEA26C14FC6C14F81F3977B830>I<EB07FC90383FFFC0
+90B512F00003804814FE4880261FF80F1380263FE00113C09038C0007F4848EB3FE090C7
+121FED0FF04814075A6C15F81503A3127E1218C8FCA2150716F0150F16E0151F16C0153F
+ED7F8015FF4A13005DEC07FC4A5A4A5A4A5A4A5A4A5A4990C7FC495A495AEB0FF0EB3FE0
+495A495A4890C8FC4848EB01F04848EB03F8485AEA1FE048B6FCB7FCA37E6C15F025397B
+B830>I<EB03FF013F13E090B512F84814FE4880481580260FFE0113C09038F0007F4848
+EB1FE0150F16F01507A26C5A6C5AC8FC150F16E0A2151FED3FC0157FEDFF800207130090
+3807FFFE495B5D8115FF6D1480D9000113C09138003FE0ED1FF0ED07F8150316FC150116
+FE1500A21218127EB4FCA2150116FC4814036C15F86C6C13076DEB1FF0D83FF0133F3A1F
+FE01FFE06CB612C06C15806CECFE00C65C013F13F001031380273A7CB830>I<EC03FC4A
+7E140F141FA2143F147F157E14FEA2EB01FCEB03F8A2EB07F0A2EB0FE0EB1FC0A2EB3F80
+A2EB7F0013FEA2485A485AA2485AA2485A485AA2485AA248C7FC12FEB8FC1780A46C1600
+C8007EC7FCAA91387FFFFE91B6FCA46E5B29397DB830>I<000FB612804815C05AA31680
+0180C8FCAEEB83FF019F13C090B512F015FC8181D9FE0313809039F0007FC049133F0180
+EB1FE06CC7120F000E15F0C81207A216F81503A31218127EA2B4FC150716F048140F6C15
+E06C141F6DEB3FC06D137F3A3FE001FF80261FFC0F13006CB55A6C5C6C5C6C14E06C6C13
+80D90FFCC7FC25397BB730>I<EC0FF8EC7FFF49B51280010714E0131F4914F090387FF8
+0F9039FFC007F84813803803FE005B485A4848EB03F0ED01E0484890C7FC5B123F5BA212
+7FEB000C903803FFE0010F13F8D8FF3F13FE48B6FCB7128016C09039FE007FE001F8EB1F
+F001E0130F49EB07F8ED03FC5B90C7120116FE1500A37EA46C7E15016D14FC121F6D1303
+000FEC07F86D130F6C6CEB1FF06DEB3FE03A03FF81FFC06C90B512806C15006D5B011F13
+F8010713E001011380273A7CB830>I<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>I<EB1FFE90B512E0000314F8000F14FE4880481580267FF80313C09038C0
+007F48C7121F16E0150FA3127E151F0018EC7FC0C812FF020313804A13004A5AEC1FF84A
+5AEC7FC04A5A92C7FC495AA2495A5CA213075CA86D5A90C9FCA8EB01C0EB07F0A2497EA3
+6D5AA2EB01C023397AB830>I<EC1FE0ECFFF8010313FE010F7F4914804914C090397FF0
+3FE09038FF800F4890380007F0D803FC13033A07F801FBF89038F007FF380FE01F4A13FC
+EA1FC0495A003FEBFF0F903800FE07903901FC03FE007FEBF801EA7E03ECF000A2EAFE07
+00FC49137EAA00FE6D13FED87E0314FCA2ECF801D87F0114F8003FEBFC03903900FE07F0
+903880FF0F001F90387FFFE06D6C13C0EA0FE06E13803A07F007FE009038F801F86C6CC7
+127C6CB414FE6CEB800390387FF01F6DB512FC6D14F86D14E0010314C00100EBFE00EC1F
+F0273A7CB830>I<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 D<D83FF8ECFFE0486C4913F0486C4913F8A2007F16F06C6C4913E00007160001EF14
+BFEC800FA39039E7C01F3FA4ECE03F01E3133EA2ECF07EA201E1137CA2ECF8FCA201E013
+F8A214FDEC7DF0A3147FEC3FE0A3EC1FC0A2EC070091C7FCADD83FFC903801FFE0486C49
+13F0B54913F8A26C486D13F06C486D13E02D387FB730>I<D83FFC90381FFF80486C4913
+C0B54913E0A26C6D6C13C06C6E13800003913801F800EBF7C0A3EBF3E0A314F013F1A214
+F8A213F014FCA2147C147EA2143E143FA2141FA21581A2140F15C1A2140715E1A2140315
+F1A21401A215F91400A3157DA3153FEA3FFF481380B5EAC01FA26CEB800F6C496C5A2B38
+7EB730>I<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
+>I<D87FFE90380FFFC0B54913E06E5AA24A7E6C486D13C0D807F0903801FC00A26D1303
+00035DA46C6C495AA46C6C495AA46D131F6D5CA3EC803F013F5CA46D6C48C7FCA490380F
+E0FEA401075B14F1A301035BA314FB01015BA314FFA26D5BA46E5A6E5A2B397EB730>I<
+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>I<EB3FFC48B57E4814
+E04880488048809038F00FFE9038E001FF806F7E6C48133F6C4880C8121FA491B5FC130F
+137F48B6FC12075A48EBC01F383FFC00EA7FE0138048C7FC5AA46C143FA26C6C137F9038
+C001FF263FF80FEBFFC06CB712E0A2000714F76C14C3C6020013C0D93FF090C7FC2B2A7C
+A830>I<EA3FFC487E12FFA2127F123F1200AAEC03FE91381FFF80027F13E091B57E90B6
+12FC82ECFE079138F001FF4A6C13804A137F4AEB3FC091C7121F4915E0160FA217F01607
+A8160FA217E07F161F6EEB3FC0A26EEB7F806E13FFDAF00313009138FC0FFE91B55A5E49
+5CD97E7F13C0D93C1F90C7FC90380003FC2C3980B730>I<ECFFE0010713FC011F7F017F
+7F90B612804815C048EB807F3907FC003F485A485A49EB1F804848EB0F004990C7FC127F
+90C9FCA25A5AA87E7EA27F003FEC07C06DEB0FE06C7E6D131F6C6C14C0D807FE133F9039
+FFC0FF806C90B5FCC615006D5B011F13F801075B01011380232A7AA830>I<913801FFE0
+4A7F5CA28080EC0007AAEB03FE90381FFF874913E790B6FC5A5A481303380FFC00D81FF0
+133F49131F485A150F4848130790C7FCA25AA25AA87E6C140FA27F003F141F6D133F6C7E
+6D137F390FF801FF2607FE07EBFFC06CB712E06C16F06C14F76D01C713E0011F010313C0
+D907FCC8FC2C397DB730>I<49B4FC010713E0011F13F8017F7F90B57E48804801811380
+3A07FC007FC04848133FD81FE0EB1FE0150F484814F0491307127F90C7FCED03F85A5AB7
+FCA516F048C9FC7E7EA27F003FEC01F06DEB03F86C7E6C7E6D1307D807FEEB1FF03A03FF
+C07FE06C90B5FC6C15C0013F14806DEBFE00010713F8010013C0252A7CA830>I<EDFF80
+020713E0021F13F05C4A13F891B5FC491387903803FE079138FC03F0903907F800C04A13
+00A8003FB612C04815E0B7FCA36C15C0260007F0C7FCB3A9003FB512FE4880B71280A26C
+15006C5C25397DB830>I<D903FC13FF90261FFF8713C04913DF90B712E05A5A2607FE07
+138F903AF801FE07C048486C6CC7FCA2497F001F8149133FA56D137F000F92C7FC6D5BA2
+6C6C485AEBFE0790B55A5D485C15C001DF5BD9C3FCC8FC01C0C9FCA37F7F6CB512F015FF
+6C15C04815F0488148813A3FE0001FFE0180130148C8127F007E8100FE168048151FA56C
+153F007FED7F006D5C6C6C495A01F013076CB4EB7FFC6C90B55A6C5D000115C06C6C91C7
+FC011F13FC010113C02B3E7DA730>I<EA3FFC487E12FFA2127F123F1200AAEC01FE9138
+0FFF80023F13E091B57E90B67EA29138FE07FCECF8039138E001FE14C0EC8000A291C7FC
+A25BB3A23B3FFFF81FFFF8486D4813FCB500FE14FEA26C01FC14FC6C496C13F82F3880B7
+30>I<14E0EB03F8A2497EA36D5AA2EB00E091C8FCA9381FFFF8487F5AA27E7EEA0001B3
+A9003FB612C04815E0B7FCA27E6C15C023397AB830>I<EC01C0EC07F0A2EC0FF8A3EC07
+F0A2EC01C091C7FCA990B512F04814F8A47EEB0003B3B3A5EC07F0A2123C007EEB0FE0B4
+131FEC3FC0147F90B512806C14005C6C5B000F13F0000313C01D4E7CB830>I<EA7FF848
+7EA4127F1200AB0203B512804A14C017E0A217C06E14809139001FE0004B5A4B5A4BC7FC
+4A5A4A5AEC0FF84A5A4A5A4A5A4A5A01FD7F90B57E8114F7ECE3F8ECC1FCEC81FEEC00FF
+497F496D7E6F7E826F7E15076F7E6F7E3B7FFFF81FFFE0B56C4813F017F8A217F06C496C
+13E02D387FB730>I<387FFFF8B57EA47EEA0001B3B3A8007FB612F0B712F8A46C15F025
+387BB730>I<02FC137E3B7FC3FF01FF80D8FFEF01877F90B500CF7F15DF92B57E6C010F
+13872607FE07EB03F801FC13FE9039F803FC01A201F013F8A301E013F0B3A23C7FFE0FFF
+07FF80B548018F13C0A46C486C01071380322881A730>I<EC01FE3A3FFC0FFF80267FFE
+3F13E000FF90B57E90B67E7E6C9038FE07FCC6EBF8039138E001FE14C0EC8000A291C7FC
+A25BB3A23B3FFFF81FFFF8486D4813FCB500FE14FEA26C01FC14FC6C496C13F82F2880A7
+30>I<49B4FC010F13E0013F13F8497F90B57E0003ECFF8014013A07FC007FC04848EB3F
+E0D81FE0EB0FF0A24848EB07F8491303007F15FC90C71201A300FEEC00FEA86C14016C15
+FCA26D1303003F15F86D13076D130F6C6CEB1FF06C6CEB3FE06D137F3A07FF01FFC06C90
+B512806C15006C6C13FC6D5B010F13E0010190C7FC272A7CA830>I<EC03FE3A3FFC1FFF
+80267FFE7F13E000FF90B57E90B612FC6C816CEBFE07C69038F001FF4A6C13804A137F4A
+EB3FC091C7121F4915E0160FA217F01607A8160FA217E07F161F6EEB3FC0A26EEB7F806E
+13FFDAF00313009138FC0FFE91B55A5E495C6E13C0021F90C7FCEC03FC91C9FCAD383FFF
+F8487FB57EA26C5B6C5B2C3C80A730>I<49B413F8010FEBC1FC013F13F14913FD48B6FC
+5A481381390FFC007F49131F4848130F491307485A491303127F90C7FC15015A5AA77E7E
+15037FA26C6C1307150F6C6C131F6C6C133F01FC137F3907FF01FF6C90B5FC6C14FD6C14
+F9013F13F1010F13C1903803FE0190C7FCAD92B512F84A14FCA46E14F82E3C7DA730>I<
+ED07F83A3FFF803FFF486DB51280B512C302CF14C06C13DF6C9038FFFC3FD8001F13E092
+38801F809238000F004A90C7FC5C5C5CA25CA45CAF003FB512FC4880B7FCA26C5C6C5C2A
+287EA730>I<90381FFC1E48B5129F000714FF5A5A5A387FF007EB800100FEC7FC4880A4
+6C143E007F91C7FC13E06CB4FC6C13FC6CEBFF806C14E0000114F86C6C7F01037F903800
+0FFF02001380007C147F00FEEC1FC0A2150F7EA27F151F6DEB3F806D137F9039FC03FF00
+90B6FC5D5D00FC14F0D8F83F13C026780FFEC7FC222A79A830>I<EB0780497E131FA900
+3FB612E04815F0B7FCA36C15E026001FC0C7FCB216F8ED01FCA5ECE003010FEB07F814F0
+9138FC1FF06DB512E06D14C016806D14009038007FFCEC1FF026337EB130>I<D83FFCEB
+3FFC486C497E00FF14FFA2007F147F003F143F00001400B3A41501A2150315076D130F90
+3A7FC07FFFF891B612FC6D15FE7F6D4913FC6D9038F87FF8010001C0C7FC2F2880A630>
+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>I<ED3FF0913803FFF8140F5C147F16F091
+38FFF00092C7FC495A5CB3A21303495A133F383FFFF0B55A5C91C8FC14C080003F7F3800
+3FF813076D7E1301B3A2806D7E15F091387FFFF016F8141F8014039138003FF025477BBE
+30>I<127CA212FEB3B3B3AD127CA207476CBE30>I<EA7FE0EAFFFE6D7E8014F07EC66C7E
+13076D7E1301B3A2806D7E15E091387FFFE06E13F8801407141F5C4A13E09138FFE00092
+C7FC495A5CB3A21303495A137F387FFFF0B5FC14C05C49C8FCEA7FE025477BBE30>I<01
+7C133848B4137C48EB80FE4813C14813C348EBEFFC397FEFFFF0D8FF8713E0010713C048
+6C1380D87C0113003838007C1F0C78B730>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fs cmbx12 17.28 40
+/Fs 40 121 df<EA01FCEA07FF4813804813C04813E04813F014F8B5FCA214FCA314FEA2
+7EA27E7E6C13BE6C133EEA01FCC7FCA2147E147CA314FC14F8A2130114F01303A2EB07E0
+A2EB0FC0A2EB1F80EB3F005B13FE485A485A485A485A5B6C5A6CC7FC173174942D>44
+D<16F04B7E1507151F153FEC01FF1407147F010FB5FCB7FCA41487EBF007C7FCB3B3B3B3
+007FB91280A6395E74DD51>49 D<913801FFF8021FEBFFC091B612F8010315FF010F16C0
+013F8290267FFC0114F89027FFE0003F7F4890C7000F7F48486E7FD807F86E148048486E
+14C048486E14E048486F13F001FC17F8486C816D17FC6E80B56C16FE8380A219FFA283A3
+6C5BA26C5B6C90C8FCD807FC5DEA01F0CA14FEA34D13FCA219F85F19F04D13E0A294B512
+C019804C14004C5B604C5B4C5B604C13804C90C7FC4C5A4C5A4B13F05F4B13804B90C8FC
+4B5AED1FF84B5A4B5A4B48143F4A5B4A48C8FC4A5A4A48157E4A5A4A5AEC7F8092C9FC02
+FE16FE495A495A4948ED01FCD90FC0150749B8FC5B5B90B9FC5A4818F85A5A5A5A5ABAFC
+A219F0A4405E78DD51>I<92B5FC020F14F8023F14FF49B712C04916F0010FD9C01F13FC
+90271FFC00077FD93FE001017F49486D8049C86C7F484883486C6F7F14C0486D826E806E
+82487FA4805CA36C5E4A5E6C5B6C5B6C495E011FC85A90C95CA294B55A614C91C7FC604C
+5B4C5B4C5B4C5B047F138092260FFFFEC8FC020FB512F817E094C9FC17F817FF91C7003F
+13E0040713F8040113FE707F717F7113E085717FA2717F85A285831A80A31AC0EA03FCEA
+0FFF487F487F487FA2B57EA31A80A34D14005C7E4A5E5F6C495E49C8485BD81FF85F000F
+5ED807FE92B55A6C6C6C4914806C01F0010791C7FC6C9026FF803F5B6D90B65A011F16F0
+010716C001014BC8FCD9001F14F0020149C9FC426079DD51>I<F01F804E7E187F18FFA2
+5F5F5F5FA25F5F5FA294B5FC5E5E5EA25E5EEE3FBFEE7F3FA216FEED01FCED03F8ED07F0
+A2ED0FE0ED1FC0ED3F8016005D15FE4A5A4A5AA24A5A4A5A4A5A4A5AA24AC7FC14FE495A
+5C1303495A495A495A5C133F49C8FC13FE485AA2485A485A485A5B121F485A48C9FC12FE
+BCFCA6CA6CEBC000B1037FB8FCA6485E7CDD51>I<01C0EE01C0D801F8160F01FF167F02
+F0EC07FFDAFF8090B5FC92B7128019006060606060606095C7FC17FC5F17E0178004FCC8
+FC16E09026FC3FFCC9FC91CBFCADED3FFE0203B512F0020F14FE023F6E7E91B712E001FD
+D9E00F7F9027FFFE00037F02F801007F02E06EB4FC02806E138091C8FC496F13C04917E0
+7113F0EA00F090C914F8A219FC83A219FEA419FFA3EA03F0EA0FFC487E487E487FA2B57E
+A319FEA35C4D13FC6C90C8FC5B4917F8EA3FF001804B13F06D17E0001F5E6C6C17C06D4B
+1380D807FC92B512006C6C4A5B6C6C6C01075B6C01E0011F5BD97FFE90B55A6DB712C001
+0F93C7FC6D15FC010115F0D9003F1480020301F0C8FC406078DD51>I<EE1FFF0303B512
+E0031F14F892B612FE0203814AD9FC037F021F9039C0007FC04A90C7EA1FE0DAFFFC6E7E
+494914074949EC7FF8494914FF49495B4949497F4990C7FC495D5C13FF485BA25A4A6E5B
+5A715B48496E5B725A4894C8FCA35AA35C48913801FFE0030F13FE033F6D7E4B14E092B6
+12F89126E1FE037FB53AE3F0007FFEDAE7E06D7EDAEFC06D7F4B6D7F02FFC76C7F4A8271
+7F4A82A24A828385A24A1780A54A17C0A37EA77EA47E6E1780A27EA21A007E4D5B7E6E5E
+7E6E5E6C4C5B6D7E013F4B5B6D6C4A5B6D01C0495B6D6D90B5C7FC6DD9FC0713FC6D90B6
+5A6D5E023F15C0020F92C8FC020114F8DA001F1380426079DD51>I<EA07E0120F7F13FC
+EBFFFC91B912F8A45AA21AF01AE01AC01A801A00A248606161616101E0C9123F01804C5A
+48CA485A4D90C7FC60007E4C5A17074D5A4D5A4D5A485F4D5A17FF4C90C8FCC9485A5F4C
+5A160F4C5A5F163F4C5A16FF5F5D94C9FC5D5D5E150FA24B5AA2153FA24B5AA215FFA34A
+5BA25CA35CA44A5BA45CA65CAD6E5BA26E5BDA03FECAFC6E5A456377E051>I<91380FFF
+F849B612C0010F15F8013F15FE496F7E2701FFF80080480180011F13F0D807FCC700077F
+D80FF080484882003F8301F880486C827FB5178080A76C90C7FC4C14006C5A6C5AD807F0
+4A5BC95C5E4C5B604C5B4C138093B5C7FC4B13FC5F4B13E05F4B5B4B90C8FC5E5E4B5A5E
+4B5AA25E4B5AA293C9FCA215FEA35DAE5D92CAFCABEC01FCEC07FF4A7F023F13E0A24A7F
+A291B57EA76E5BA26E5BA2020F13806E90C9FCEC01FC396577E44C>63
+D<F00FE04E7EA24E7EA34E7EA24E7EA34D7FA24D80A24D80A34D80A24D80A34D80A2DD7F
+BF7FA2181F05FF8017FE04016D7FA24D7E04038217F804076D80A24D7E040F8217E0041F
+6D80A24D7F043F825F047F6E7FA294C77E4C825E03016F7FA24C800303845E03076F80A2
+4C80030F845E031F6F80A24C81033F845E037F707F93B9FCA292BA7EA24A85A203FCC912
+070203865D020771805D86020F864B82021F865D87023F864B83027F8692CBFC874A864A
+840101875C496C728090381FFFC0B700E092B812FEA66F647BE37A>65
+D<4DB5ED03C0057F02F014070407B600FE140F047FDBFFC0131F4BB800F0133F030F05FC
+137F033F9127F8007FFE13FF92B6C73807FF814A02F0020113C3020702C09138007FE74A
+91C9001FB5FC023F01FC16074A01F08291B54882490280824991CB7E4949844949844949
+8449865D49498490B5FC484A84A2484A84A24891CD127FA25A4A1A3F5AA348491A1FA448
+99C7FCA25CA3B5FCB07EA380A27EA2F50FC0A26C7FA37E6E1A1F6C1D80A26C801D3F6C6E
+1A00A26C6E616D1BFE6D7F6F4E5A7F6D6D4E5A6D6D4E5A6D6D4E5A6D6E171F6D02E04D5A
+6E6DEFFF806E01FC4C90C7FC020F01FFEE07FE6E02C0ED1FF8020102F8ED7FF06E02FF91
+3803FFE0033F02F8013F1380030F91B648C8FC030117F86F6C16E004071680DC007F02F8
+C9FC050191CAFC626677E375>67 D<BB12E0F2FF801BF01BFE757E1CF0D800010280C700
+0780DF007F13FE080F6D7E0801807480093F7F090F13FC757F757F877580767F8A88767F
+8A888AA2767FA28A881F80A37614C0A41FE0A5881FF0B05214E0A51FC0A4521480A31F00
+6466A2525BA2525BA2525B666499B55A515C5191C7FC515B515B515B097F5B50B512C008
+075C083F91C8FC0707B512FCBD12F01CC051C9FC1BF81B8008E0CAFC6C627AE17C>I<4D
+B5ED03C0057F02F014070407B600FE140F047FDBFFC0131F4BB800F0133F030F05FC137F
+033F9127F8007FFE13FF92B6C73807FF814A02F0020113C3020702C09138007FE74A91C9
+001FB5FC023F01FC16074A01F08291B54882490280824991CB7E49498449498449498449
+865D49498490B5FC484A84A2484A84A24891CD127FA25A4A1A3F5AA348491A1FA44899C8
+FCA25CA3B5FCB07E071FB812F880A37EA296C70001ECC000A26C7FA37E807EA26C80A26C
+80A26C807F6D7F816D7F7F6D7F6D6D5F6D14C06D6E5E6E7F6E01FC5E020F01FF5E6E02C0
+ED7FEF020102F8EDFFC76E02FF02071383033F02FC013F1301030F91B638FC007F03014D
+131F6F6C04E01307040704801301DC007F02F8CAFC050191CBFC6D6677E37F>71
+D<B96C90B91280A6D8000102C0C9000102C0C7FCB3B3A293BBFCA604C0C91201B3B3A6B9
+6C90B91280A671627AE17E>I<B912E0A6C702E0C7FCB3B3B3B3AEB912E0A633627CE13C>
+I<B700E0040FB7128082828282A2D800016EDC000101FCC7FC719338001FC08383A28302
+FD808302FC80816F7F6F806F8084816F806F806F8084707F827080708085708082708070
+8085717F83718071807180868371807180727F8672808472807280877280847280737F87
+731480857314C07314E01CF07314F8857314FC7413FE7413FF1D9F867414DF7414FF86A2
+86868787A287878787A28787888888A288888890261FFFC084B712F8881D7F1D3F1D1F77
+5A71627AE17E>78 D<DBFFFCEC01E0020FD9FFE01303027F02FC130749B7130F0107EEC0
+1F011F16F049D9C007EBF83F4948C7383FFE7FD9FFF8020FB5FC4801E014014849804849
+153F91C97E484882001F834982003F83845B007F187FA2193FA200FF181FA27F190FA27F
+A26D17078080806C01F893C7FC80ECFF8015F86CECFFC016FC6CEDFFE017FE6CEEFFE018
+F86C17FE6C717E6C846C846D17F86D836D836D8313036D18806D6C17C0020F17E01401DA
+000F16F01500040715F8EE007F1703050014FC183F84060713FE84A2007C8300FC83A219
+7FA3193F7EA31AFC7EA27F1AF86D177F7F1AF06D17FF6D18E06D5E01FF18C06E4B138002
+E04B130002F84B5A02FFED3FFC01CF01E0ECFFF8018301FF010F5B010191B65A6D6C5E48
+011F93C7FC48010315FC48D9003F14E048020149C8FC476677E35A>83
+D<001FBEFCA64849C79126E0000F148002E0180091C8171F498601F81A0349864986A249
+1B7FA2491B3F007F1DC090C9181FA4007E1C0FA600FE1DE0481C07A5CA95C7FCB3B3B3A3
+021FBAFCA663617AE070>I<B96C023FB612FEA6D8000102C0CA0007EBF000E2007FC7FC
+B3B3B3AA656D63A2821C01806570170380525A6E7F6E4F5A70171F6E626E6D4D5A6E6D17
+7F525A6E6E030390C8FC033F01E04B5A6F6DED1FFC6F01FCED7FF80303D9FF80903803FF
+E06F02F8017F5B6F6C90B7C9FC041F5E040716F8040016C0050F4ACAFCDD003F13C06F64
+7AE17C>I<B800F8011FB80203B7FCA6D8000F91C9000102E0CAEBFE006D72F20FF07072
+715A230F6D73627072171F6D6A708277173F6D7397C7FC70846B6E72197E707217FE6E72
+6170855118016E6870731503636E68704C6E15076E68718451180F6EDE7E7F607172151F
+6E06FE61714B7E08016F153F6E4E6C95C8FC71840803616F4D6C177E7102076F15FE6F66
+714B7E080F7013016F4D6C5F7185081F18036F4D6C5F71023F7013076F94C75F72845018
+0F6F047E6E5E7272131F1AFE6F4C6E5EDEE00171133F6F4C6E93C9FC06F084070361704B
+6E157E06F87213FE1907704B6E5DDEFC0F1881704B6E5D06FE19C1071F18C3704B6E5DDE
+FF3F18E7706407BFC9FC07FF18FF704A705CA3704A705CA27099CAFC4F82A27149705BA3
+7149705BA27149705BA37149705BA37190CB5BA27148725AA37148725A714872CBFCA063
+7DE1A7>87 D<913803FFFE027FEBFFF00103B612FE010F6F7E4916E090273FFE001F7FD9
+7FE001077FD9FFF801017F486D6D7F717E486D6E7F85717FA2717FA36C496E7FA26C5B6D
+5AEB1FC090C9FCA74BB6FC157F0207B7FC147F49B61207010F14C0013FEBFE004913F048
+B512C04891C7FC485B4813F85A5C485B5A5CA2B55AA45FA25F806C5E806C047D7F6EEB01
+F96C6DD903F1EBFF806C01FED90FE114FF6C9027FFC07FC01580000191B5487E6C6C4B7E
+011F02FC130F010302F001011400D9001F90CBFC49437CC14E>97
+D<903807FF80B6FCA6C6FC7F7FB3A8EFFFF8040FEBFF80047F14F00381B612FC038715FF
+038F010014C0DBBFF0011F7FDBFFC001077F93C76C7F4B02007F03F8824B6F7E4B6F1380
+4B17C0851BE0A27313F0A21BF8A37313FCA41BFEAE1BFCA44F13F8A31BF0A24F13E0A24F
+13C06F17804F1300816F4B5A6F4A5B4AB402075B4A6C6C495B9126F83FE0013F13C09127
+F00FFC03B55A4A6CB648C7FCDAC00115F84A6C15E091C7001F91C8FC90C8000313E04F65
+7BE35A>I<F17FF8050FB5FCA6EF000F8484B3A892380FFF804AB512F8020F14FE023FEC
+FF8391B712E301039138807FF3499039F8000FFB011F01E00103B5FC494913004990C87E
+49488148498148834A815A485BA2485BA25AA3485BA4B5FCAE7EA46C7FA37EA26C7FA26C
+5F806C5F6C6D5D6C6D5D017F93B5FC6D6C6C0103806D6D49806D01F0D91FF7EBFFFE6D90
+39FE01FFE7010190B612876D6CECFE07021F14F8020314E09127003FFE00ECC0004F657B
+E35A>100 D<92380FFFC04AB512FC020FECFF80023F15E091B712F80103D9FE037F4990
+39F0007FFF011F01C0011F7F49496D7F4990C76C7F49486E7F48498048844A804884485B
+727E5A5C48717EA35A5C721380A2B5FCA391B9FCA41A0002C0CBFCA67EA380A27EA27E6E
+160FF11F806C183F6C7FF17F006C7F6C6D16FE6C17016D6C4B5A6D6D4A5A6D01E04A5A6D
+6DEC3FE0010301FC49B45A6D9026FFC01F90C7FC6D6C90B55A021F15F8020715E0020092
+C8FC030713F041437CC14A>I<EE3FFC0307B51280033F14C04AB612F0020715F84A9038
+F03FFC4AEB807F913A7FFE00FFFE4A5A4B4813FF4913F05B4913E0A24913C0A27013FE49
+49EB7FFCEF3FF8EF1FF0EF07C094C7FCB0B812C0A6D8001F01C0C8FCB3B3B0007FB612FC
+A638657CE431>I<F107F8DB7FFEEC3FFE020FB5D8F001B5FC027FDAFE03148049B7128F
+49DCDFFD13C0010FD9F00FEBFFC149D9800114014990C7EBFC0349486E6C7E4948EC3FFF
+48496E018113800780130048F0C03E97C7FC48496E7FA34884A96C60A36C6D4A5BA26C60
+A26C6D4A90C8FC6D6C4A5A6D6C4A5A6D6D485BDBF00F5B4990B612C060D97C7F4AC9FCD9
+FC0F14F09126007FFECAFC92CCFC1201A47FA27F8014F091B77E18FE6CEFFFC019F06D17
+FC19FF6D846D846D846D84013F8490BAFC0003854801E0C712014890C9000F7F48481601
+4848EE007F4848717E8512FF5B85A56D5F007F616D173F003F616D177F6C6C4D5A6C01C0
+03035B6C6D4B5B6C01F8031F5BC601FF92B5C7FC6D01F8011F5B011F90B712F8010717E0
+010094C8FC020F15F0DA003F01FCC9FC4A607CC151>I<903807FF80B6FCA6C6FC7F7FB3
+A8EF1FFF94B512F0040714FC041F14FF4C8193267FE07F7F922781FE001F7FDB83F86D7F
+DB87F07FDB8FC0814C7F039FC78015BE03BC8003FC825DA25DA25DA45DB3B2B7D8F007B7
+1280A651647BE35A>I<EB0FE0EB3FF8497E48B5FCA24880A24880A76C5CA26C91C7FCA2
+38007FFC6D5AEB0FE090C9FCAF903807FF80007FB5FCA6C6FC7F7FB3B3AEB712C0A62265
+7BE42C>I<ED01FCED07FF4B1380033F13E0A24B13F0A292B512F8A76F13F0A26F13E0A2
+030F13806F1300ED01FC92C8FCAFEEFFF8021FB5FCA6EC000F8181B3B3B3AAEA07F0EA1F
+FC487E487EB56C4813F0A317E05D17C05D17806C4948130049495A6C48495A261FFE0313
+F06CB65A6C158000014AC7FC6C6C13F8010713802D8288E431>I<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>I<D90FFFEB0FFCB690383FFF8093B512
+E04B14F04B14F8923907FC7FFC92390FE0FFFEC6EC1F806DD93F0113FF6D133E157E157C
+15F8A215F07013FEA24BEB7FFCEF3FF8EF0FE04B90C7FCA55DB3B0B712F8A638417BC042
+>114 D<913A3FFF8007800107B5EAF81F011FECFE7F017F91B5FC48B8FC48EBE0014890
+C7121FD80FFC1407D81FF0801600485A007F167F49153FA212FF171FA27F7F7F6D92C7FC
+13FF14E014FF6C14F8EDFFC06C15FC16FF6C16C06C16F06C826C826C826C82013F168001
+0F16C01303D9007F15E0020315F0EC001F1500041F13F81607007C150100FC81177F6C16
+3FA2171F7EA26D16F0A27F173F6D16E06D157F6D16C001FEEDFF806D0203130002C0EB0F
+FE02FCEB7FFC01DFB65A010F5DD8FE0315C026F8007F49C7FC48010F13E035437BC140>
+I<EC07E0A6140FA5141FA3143FA2147FA214FF5BA25B5B5B5B137F48B5FC000F91B512FE
+B8FCA5D8001F01E0C8FCB3AFEF0FC0AC171F6D6D1480A2173F6D16006F5B6D6D137E6D6D
+5B6DEBFF836EEBFFF86E5C020F14C002035C9126003FFCC7FC325C7DDA3F>I<902607FF
+C0ED3FFEB60207B5FCA6C6EE00076D826D82B3B3A260A360A2607F60183E6D6D147E4E7F
+6D6D4948806D6DD907F0ECFF806D01FFEB3FE06D91B55A6E1500021F5C020314F8DA003F
+018002F0C7FC51427BC05A>I<B70081B600FC0103B512FCA6C66C0180C701FCC8381FFE
+006F6FED03F86D047F5F856F6E16076D646F70140F6D705F866F6E161F6D646F4A6D143F
+6D99C7FC4E7F6F616D1B7E6F4A6D14FE6D6395B57E7001FC15016E62DCC0016E13036EDB
+F87F5D05038004E0496C14076E62DCF007ED800F6E4B6C5D050F15C004F8496C141F6E62
+DCFC1FEDE03F6E4B6C92C8FC053F15F004FE496C5C6E197E7048EDF8FE6E027E6D5C05FE
+15FC4D6D13FD6F601BFF6F496E5BA24D806F60A26F496E5BA24D806F60A26F496E90C9FC
+A294C87E6F5FA26F486F5A047C6F5A6E417DBF75>119 D<007FB600C0017FB512F8A6D8
+001F01F8C70007EBF0006D040190C7FC6D6D5D6D6D4A5A6D6D4A5A70495A6D4C5A6E7F6E
+6D495A6E6D495A7049C8FC6E4A5A6E6D485A6E6D485A6E13FFEF8FF06EEC9FE06FEBFFC0
+6F5C6F91C9FC5F6F5B816F7F6F7F8481707F8493B57E4B805D4B80DB0FF37FDB1FE17F04
+C080153F4B486C7F4B486C7F4A486D7F4A486D7F4A5A4B6D7F020F6E7F4A486D7F4A486D
+804A5A4AC86C7F49486F7F4A6F7F0107707FEB3FFFB600F049B7FCA650407EBF55>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Ft cmsy10 10.95 2
+/Ft 2 16 df<EE7FFE0307B512E0033F14FC92B7FC0203D9C00313C0DA0FFCC7EA3FF0DA
+3FE0EC07FCDA7F80EC01FED901FEC9EA7F80D903F8EE1FC0D907E0EE07E04948707E4948
+707E49CB7E017E187E498449844848F00F8000031AC04918074848F003E0A24848F001F0
+A248CD12F8A2001E1A78003E1A7CA2003C1A3C007C1A3EA200781A1EA300F81A1FA2481A
+0FAB6C1A1FA200781A1EA3007C1A3EA2003C1A3C003E1A7CA2001E1A78001F1AF8A26C6C
+F001F0A26C6CF003E0A26C6CF007C06D180F00011A806C6CF01F006D60017E187E6D606D
+6C4C5A6D6C4C5A6D6C4C5AD903F8EE1FC0D901FEEE7F809026007F80DA01FEC7FCDA3FE0
+EC07FCDA0FFCEC3FF0913B03FFC003FFC0020090B6C8FC033F14FC030714E09226007FFE
+C9FC50557BC05B>13 D<EB0FFCEB3FFF90B512C0000314F04880488048804880A2481580
+A3B712C0AA6C1580A36C1500A26C5C6C5C6C5C6C5CC614C0013F90C7FCEB0FFC22227BA7
+2D>15 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fu cmbx12 14.4 61
+/Fu 61 123 df<EEFFFC031FEBFF804AB612E0020781021F9038C00FF8913A7FFE0003FC
+DAFFF0EB00FE4949EB03FF4901805B4990C7487F49485CA2495A4D7F013F6F5B5CA37190
+C7FC715AEF01F894C9FCA90403B512C0BAFCA526003FFCC7120783B3B3A6003FB5D8FC03
+B612C0A542547DD34B>12 D<EA07F0EA1FF8487E487E7FB5FC1480A314C0A37EA27E7EEA
+07F3EA0003A213071480A3130F1400A25B131E133E133C137C5BA2485A485A485A485A48
+C7FC121E120C1228769025>44 D<B712F0AB240B7F9F2D>I<EA07F0487E487E487E487E
+B51280A76C13006C5A6C5A6C5A6C5A1111769025>I<157815FC14031407141F14FF130F
+0007B5FCB6FCA2147F13F0EAF800C7FCB3B3B3A6007FB712FEA52F4E76CD43>49
+D<EC3FFE0103B512E0010F14FC013F14FF90B712C048D9C07F7F2703FE000F13F8D807F8
+01037FD80FE06D7F48486D7F48488001F01680486C6E13C07F486C6E13E07FA27013F0A5
+6C5AA26C5AEA0FF0EA03C0C914E05EA218C05E1880A24C13005F4C5A4B5B5F4B5B5F4B5B
+4B90C7FC4B5A5E4B5AED7FE04B5A4A5B4A48C8FC4A5A5D4A48EB01F04A5AEC3F804AC7FC
+02FEEC03E0495A495A495A495AD91F80140749C8FC013E150F017FB7FC90B812C05A5A5A
+5A5A5A5AB9FC1880A4344E79CD43>I<91380FFFC091B512FC0107ECFF80011F15E09026
+3FF8077F9026FF800113FC4848C76C7ED803F86E7E491680D807FC8048B416C080486D15
+E0A4805CA36C17C06C5B6C90C75AD801FC1680C9FC4C13005FA24C5A4B5B4B5B4B13C04B
+5BDBFFFEC7FC91B512F816E016FCEEFF80DA000713E0030113F89238007FFE707E701380
+7013C018E07013F0A218F8A27013FCA218FEA2EA03E0EA0FF8487E487E487EB57EA318FC
+A25E18F891C7FC6C17F0495C6C4816E001F04A13C06C484A1380D80FF84A13006CB44A5A
+6CD9F0075BC690B612F06D5D011F1580010302FCC7FCD9001F1380374F7ACD43>I<177C
+17FEA2160116031607160FA2161F163F167FA216FF5D5DA25D5DED1FBFED3F3F153E157C
+15FCEC01F815F0EC03E01407EC0FC01580EC1F005C147E147C5C1301495A495A5C495A13
+1F49C7FC133E5B13FC485A5B485A1207485A485A90C8FC123E127E5ABA12C0A5C96C48C7
+FCAF020FB712C0A53A4F7CCE43>I<D80380150ED807E0157E01FEEC03FED9FFF0137F91
+B65A5F5F5F5F5F94C7FC5E5E16F016C093C8FC15F801E190C9FC01E0CAFCABEC0FFF027F
+13F001E3B512FE01E76E7E9026FFF8077FDAC0017F49C713F8496E7E49143F4981496E7E
+6C481680C9FC18C08218E0A418F0A3EA0FE0487E487E487E487EA418E0A35B6C484A13C0
+5B491680003EC85A003F17006C6C4A5A6D5D6C6C4A5AD807F8495BD803FE01075B2701FF
+C03F5B6C90B65A013F4AC7FC6D14F8010314C09026007FF8C8FC344F79CD43>I<ED0FFF
+92B512E0020780021F14FC91397FFE03FE903A01FFF0007F4901C0EB3F804990C7121F49
+48EC7FC0494814FF49484913E049485B01FF5C485BA2485B5AA2486F13C04A6D1380486F
+1300177E94C7FC5AA291CAFC5AA21508913801FFF8020713FFB54814C04A14F04AC66C7E
+023C6D7E4A6D7E4A6D7E7013804A15C0A24A15E07013F05C18F8A491C714FCA37EA67EA4
+6C17F880A27E18F06C5D18E06C6D15C07E6E4913806C6D15006D6C495A6D6CEB7FFC6DB4
+48485A6D90B55A010315C0010092C7FC023F13FC020713C0364F7ACD43>I<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
+D<BA12C019FEF1FFC01AF01AFCD8000701F0C7000313FFDE007F7F737F070F7F737F8785
+87858785A287A84F5BA263616361634F5B4F5B077F90C7FC4E485A060713F892B812E097
+C8FC861AF003F0C7000313FE9539003FFF80070F13E0737F07017F87737F747E1C807413
+C0A27413E0A31CF0A386A362A31CE0A2621CC0A250138097B5FC1C004F5B19074F5B073F
+13F04EB55ABC128098C7FC1AF81AC007F8C8FC54527CD160>I<932601FFFCEC01C0047F
+D9FFC013030307B600F81307033F03FE131F92B8EA803F0203DAE003EBC07F020F01FCC7
+383FF0FF023F01E0EC0FF94A01800203B5FC494848C9FC4901F882494982494982494982
+4949824990CA7E494883A2484983485B1B7F485B481A3FA24849181FA3485B1B0FA25AA2
+98C7FC5CA2B5FCAE7EA280A2F307C07EA36C7FA21B0F6C6D1980A26C1A1F6C7F1C006C6D
+606C6D187EA26D6C606D6D4C5A6D6D16036D6D4C5A6D6D4C5A6D01FC4C5A6D6DEE7F806D
+6C6C6C4BC7FC6E01E0EC07FE020F01FEEC1FF80203903AFFE001FFF0020091B612C0033F
+93C8FC030715FCDB007F14E0040101FCC9FC525479D261>I<BA7E19FCF1FF801AF01AFC
+D8000701F0C7000F13FF060014C0071F7F070713F807017F737F747E747F747F86747F74
+7F8886888688A2757EA31D8087A21DC0A51DE0A387A963A31DC0A51D80A2631D00A3515A
+A2646264505B6264505B505B5090C7FCF2FFFE4F5B07075B071F5B96B512C0060F91C8FC
+BB5A1AF01AC007FCC9FC19805B527CD167>I<BC1280A5D8000701F8C7000114C0F0001F
+19071901851A7F1A3F1A1FA2F20FE0A21A07A31A03A318F81BF01A01A497C7FC1701A317
+031707170F177F92B6FCA59238F8007F170F170717031701A317001B3EA31B7CA395C8FC
+A21BFCA21BF8A21A01A31A031BF01A071A0FA21A1F1A3FF27FE0F101FF1907191F0603B5
+FCBCFCA21BC0A34F517CD058>I<BB12FEA5D8000701F8C700077FF0007F191F19078585
+8586861B80A21A1FA31A0FA41BC006F81307A497C7FCA31701A317031707170F177F92B6
+FCA59238F8007F170F170717031701A31700A795C9FCB3B812F8A54A517CD055>I<9326
+01FFFCEC01C0047FD9FFC013030307B600F81307033F03FE131F92B8EA803F0203DAE003
+EBC07F020F01FCC7383FF0FF023F01E0EC0FF94A01800203B5FC494848C9FC4901F88249
+49824949824949824949824990CA7E494883A2484983485B1B7F485B481A3FA24849181F
+A3485B1B0FA25AA298C8FC5CA2B5FCAE6C057FB712E0A280A36C94C7003FEBC000A36C7F
+A36C7FA27E6C7FA26C7F6C7FA26D7E6D7F6D7F6D6D5E6D7F6D01FC93B5FC6D13FF6D6C6D
+5C6E01F0EC07FB020F01FEEC1FF10203903AFFF001FFE0020091B6EAC07F033FEE001F03
+0703FC1307DB007F02E01301040149CAFC5B5479D26A>I<B8D8C003B8FCA5D8000701F8
+C9001FEBE000B3AE92BAFCA503F8C9121FB3B1B8D8C003B8FCA560527CD169>I<B812C0
+A5D8000701F8C7FCB3B3B3B2B812C0A52A527CD132>I<B800C091B612F8A5D8000701F8
+C90003EBF8009738007F8051C7FC505AF203F8F20FF0505A505A505A50C8FCF101FCF107
+F84F5A4F5A4F5A4F5A07FEC9FCF003FC4E5A4E5A4E5A4E5A4E5ADD01FECAFC4D5A4D5A4D
+5A4D7E173F4D7E4C487E4C7F5E4C804C804C80EEFF7F9226F9FE3F7FDBFBFC809226FFF8
+1F7F4C7EDCC0077F0480804C7E4B6D804B6D804B8284727F727F8684727F727F87847280
+87737F85737F87737F85737F88857380747F888697B512FCB800C0013FECFFFEA55F527C
+D169>75 D<B812F8A5D8000701F8CAFCB3B3A91A7CA41AFC1AF8A51901A31903A219071A
+F0190FA2191F193F197F19FF180360183F4DB5FCBB12E0A546527CD151>I<B600FC073F
+B512FE6F61A26F96B6FCA2D80007F5C00070EF01EFA202EF6DEF03CFA202E76DEF078FA2
+02E36DEF0F0FA202E16D171EA302E06D173CA26F6C1778A26F6C17F0A26F6DED01E0A26F
+6DED03C0A36F6DED0780A26F6DED0F00A26F6D151EA26F6D5DA3706C5DA2706C5DA2706D
+495AA2706D495AA2706D495AA3706D49C7FCA2706D131EA2706D5BA2716C5BA3716C5BA2
+71EB81E0A271EBC3C0A271EBE780A27101FFC8FCA3715BA2715BA2725AA2725AA2D93FFC
+6F5AB74DB712FEA2725AA2725A77527CD180>I<B600FC93B7FC8181A282D800076E9239
+003FFC0070EE07E08282A28202EF7F02E77F02E380A202E18002E0806F7F6F7F6F7FA26F
+7F6F7F6F806F80A26F80707F707F707F707FA2707F7080708070808583717F717F717F71
+7FA27114807114C07114E07213F07213F8A27213FC7213FE7213FF721487A27214C77214
+E77313F77313FF85A285858585A28586868686A286868686A2D93FFC187FB7173F1B1F1B
+0F1B07755A60527CD169>I<93380FFFC00303B6FC031F15E092B712FC0203D9FC0013FF
+020F01C0010F13C0023F90C7000313F0DA7FFC02007F494848ED7FFE4901E0ED1FFF4949
+6F7F49496F7F4990C96C7F49854948707F4948707FA24849717E48864A83481B804A8348
+1BC0A2481BE04A83A2481BF0A348497113F8A5B51AFCAF6C1BF86E5FA46C1BF0A26E5F6C
+1BE0A36C6D4D13C0A26C6D4D1380A26C1B006C6D4D5A6E5E6C626D6C4C5B6D6D4B5B6D6D
+4B5B6D6D4B5B6D6D4B5B6D6D4B90C7FC6D6D4B5A6D01FF02035B023F01E0011F13F0020F
+01FC90B512C0020390B7C8FC020016FC031F15E0030392C9FCDB001F13E0565479D265>
+I<BAFC19F819FF1AE086D8000701F0C7001F13FC060113FF726C13807313C0070F13E01B
+F0857313F81BFCA27313FEA41BFFA81BFEA31BFC61A21BF84F13F04F13E0614F13C04F13
+004E485A061F5B92B812F01AC04FC7FC19E003F8CBFCB3AEB812C0A550527CD15C>I<93
+380FFFC00303B6FC031F15E092B712FC0203D9FC0013FF020F01C0010F13C0023F90C700
+0313F0DA7FFC02007F902601FFF0ED3FFE49496F7E49496F7F49496F7F4990C96C7F4948
+707F4948707F01FF854A177F48864849717EA24849711380A2481BC04A83481BE0A24A83
+481BF0A3481BF8A291CB7EA3B51AFCAF6C1BF8A26E5FA36C1BF0A36C6D4D13E0A36C1BC0
+6E5F6C1B806E5F6CDB01FE16006C6D902607FF80495A4C13E06C6D013F6D495A017F9126
+7F03F85C6D6C90277C00FC015B6D6C49D97E035B6D01806E485B6D6D48D91F8F5B6D01E0
+039F90C7FC6D01F06EB45A6DD9FCF85DDA3FFF6E13F0020F6D4913C0020301FF90B5C8FC
+020091B512FC031F180C0303181EDB001FEBE3FE93C7EA01FF74133E74137E7413FEF2F8
+077290B5FC1CFCA285A21CF8A2851CF07314E0A27314C0731480731400735B9638007FF8
+F21FE0576A79D265>I<B912F0F0FF8019F819FF1AC0D8000701F0C714F0060F7F060113
+FE727F737F737F85737F87A2737FA387A863A2616363A24F5B4F5B4F90C8FC4F5A06035B
+060F13F095B512C092B8C9FC19F819E019F89226F0000313FE9439007FFF80727F727F72
+7F727F727F8684A28684A787A71D1C75133EA38575137E73157C7513FC731401B86C6D90
+38F803F807039038FE07F07390B512E0736C14C0080F1400CEEA7FFC5F537CD164>I<91
+260FFF80130791B500F85B010702FF5B011FEDC03F49EDF07F9026FFFC006D5A4801E0EB
+0FFD4801800101B5FC4848C87E48488149150F001F824981123F4981007F82A28412FF84
+A27FA26D82A27F7F6D93C7FC14C06C13F014FF15F86CECFF8016FC6CEDFFC017F06C16FC
+6C16FF6C17C06C836C836D826D82010F821303010082021F16801400030F15C0ED007F04
+0714E01600173F050F13F08383A200788200F882A3187FA27EA219E07EA26CEFFFC0A27F
+6D4B13806D17006D5D01FC4B5A01FF4B5A02C04A5A02F8EC7FF0903B1FFFC003FFE0486C
+90B65AD8FC0393C7FC48C66C14FC48010F14F048D9007F90C8FC3C5479D24B>I<003FBC
+1280A59126C0003F9038C0007F49C71607D87FF8060113C001E08449197F49193F90C817
+1FA2007E1A0FA3007C1A07A500FC1BE0481A03A6C994C7FCB3B3AC91B912F0A553517BD0
+5E>I<B800C00103B612FCA5D8000701F8CAEBF000F31F80B3B3B11B3FA26D97C7FC8163
+7F1B7E6D6D17FE505A6E7E505A6E6D15076E4D5A6E6D4B5A6E6D4B5A6E01F84B5A6E6DDA
+03FFC8FC6E6CB46CEB0FFE6F9039F001FFF8030F90B65A030316C0DB007F92C9FC040F14
+F8DC007F13805E537CD167>I<B700FE031FB512FEA5D8001F01F0CA383FFE00F307F06D
+626F170F6D62811B1F6D6D601B3F6D97C7FC6F5F6D197E821BFE6E6D5E1A016E6D5E1A03
+6E60701507A26E6D5E1A0F6E6D5E1A1F6E6070153FA26E6D93C8FC626E6E147E1AFE6F5E
+711301A26F6D5C19036F6D5C19076F5E71130FA26F6D5C191F6F6D5C193F6F93C9FC715B
+A26FEC807E19FE706D5A18C1705C18E3705C18F318F770EBFFE0A2705CA2705CA37091CA
+FCA2705BA2715AA3715AA2715AA2715A715A5F537DD166>I<B700FC017FB600FE91B612
+F0A5D8003F01C0C8001F01E0C9EBF8006F71EE0FC06D7161876F1C1F6D7196C7FC6F8373
+606D1E3E6F836D7160876F1CFC6D666F4B801F016D66704A806E525A88704A17076E059F
+5F70021F80080F160F6E6570023F806EDC3E074CC8FC8870027E5F6EDC7C03163E7002FC
+804F6C167E6E1C7C700101814F6C16FC6E745B70010317016E4C6D5D060716C00580496D
+14036F63DDC00F16E04F6D14076F07F05BDDE01F170F6F92C76C5D1DF8DDF03E6E141F6F
+98C9FCDDF87E16FC067C6E5C6FF1FE3EDDFCFC177E6F4A6E147C1DFFDDFFF06E14FC6F62
+A24E816F62A270496F5BA24E817061A295C97E7061A270487090CAFCA37048705AA24D16
+01040360A27048705A84537DD18B>I<003FB7D88003B7FCA5D8000749C8000701F8C7FC
+6D6D9238007F806D6E93C8FC7015FE6D17016E6D5D704A5A6E16076E6D4A5A6E6D5D4F5A
+6E6D143F6E6D4A5A7191C9FC6E16FE6EECC00171485A6F5D6F6D485A6FEBF80F71485A6F
+5D6F6D485AEFFF7F6F4ACAFC6F5C6F5CA2705B705B8482707F707FA2707F7080855E4C80
+855E4C80DC3FCF7F058F7FEE7F074C6C7FDB01FE814C7E4B486C8003076E7F4B48814C7F
+4B486D7F033F824C7F4BC76C7F4B6E7F4A5A4B6E804A486E800207844A48814B6F7F4A48
+83023F824A486F7F92C96C7F02FE840101830103718090263FFFC084B76C0103B712F8A5
+5D527CD166>I<EC7FFF0107B512F0013F14FE90B77E48D9E00F7F2703FE000113F0486C
+6D7F6EEB3FFC48826E131F83707FA36C496D7FA26C90C7FC6C5AC9FCA6037FB5FC020FB6
+FC91B7FC01071487013FEBF0074913803901FFFC004813F0485B485B485B4890C7FC5A5B
+A2485AA45EA26D5C007F151D163D6C6C02797F6C6D01F113F86C9026C003E1EBFFE06C90
+26F81FC014F06C90B5487EC6ED001F011F01FC010713E0010101E090C8FC3C387CB641>
+97 D<EB3FF0B5FCA51203C6FCB3A4923801FFE0030F13FE033FEBFFC092B612F002F301
+017F913AF7F8003FFEDAFFE0EB0FFF03806D7F92C76C7F4A6E7F4A824A6E7FA2727EA285
+A28584A31A80AC1A00A44E5AA36118FF616E4A5BA26E4A5B6E4A5B6F495BDACFC04990C7
+FCDA87F0EB7FFC913A03FE03FFF849C6B612E0496D148049011F01FCC8FC90C7000313C0
+41547BD24B>I<913801FFF8021FEBFF8091B612F0010315FC010F9038C00FFE903A1FFE
+0001FFD97FFC491380D9FFF05B4817C048495B5C5A485BA2486F138091C7FC486F130070
+5A4892C8FC5BA312FFAD127F7FA27EA2EF03E06C7F17076C6D15C07E6E140F6CEE1F806C
+6DEC3F006C6D147ED97FFE5C6D6CEB03F8010F9038E01FF0010390B55A01001580023F49
+C7FC020113E033387CB63C>I<4DB47E0407B5FCA5EE001F1707B3A4913801FFE0021F13
+FC91B6FC010315C7010F9038E03FE74990380007F7D97FFC0101B5FC49487F4849143F48
+4980485B83485B5A91C8FC5AA3485AA412FFAC127FA36C7EA37EA26C7F5F6C6D5C7E6C6D
+5C6C6D49B5FC6D6C4914E0D93FFED90FEFEBFF80903A0FFFC07FCF6D90B5128F0101ECFE
+0FD9003F13F8020301C049C7FC41547CD24B>I<913803FFC0023F13FC49B6FC010715C0
+4901817F903A3FFC007FF849486D7E49486D7E4849130F48496D7E48178048497F18C048
+8191C7FC4817E0A248815B18F0A212FFA490B8FCA318E049CAFCA6127FA27F7EA218E06C
+EE01F06E14037E6C6DEC07E0A26C6DEC0FC06C6D141F6C6DEC3F806D6CECFF00D91FFEEB
+03FE903A0FFFC03FF8010390B55A010015C0021F49C7FC020113F034387CB63D>I<ED3F
+FC0203B5FC020F14C0023F14E09139FFF81FF0499038C03FF849EB807F49903800FFFC49
+5A495AA2495AA2EE7FF8495AEE3FF0EE0FC093C7FCAEB712E0A526007FF8C8FCB3B3A700
+7FB512FEA52E547CD329>I<DA3FFF14FF0103B5D8F00713C0010FDAFC1F13E0013FECFF
+7F90267FFC0F9038FF9FF09026FFE001EBF83F48496C13E0484990387FF01F4890C7D83F
+F813E0489338FC0FC0F0078048486E6CC7FCA2003F82A9001F5EA26C6C4A5AA26C5E6C6D
+495A6C6D495A6C6D485BDAFC0F5B4890B6C8FCD803EF14FC01C314F02607C03F90C9FC91
+CBFCA2120FA37FA213F813FE90B7FC6C16F817FF18C06C836C836C836D828448B9FC1207
+4848C700031480D81FF8EC003F4848150748486F13C083485A83A56D5D007F18806D5D00
+3F18006C6C4B5AD80FFEED1FFC6C6C6CEC7FF86C01E049485A6C01FE011F5B6C6CB71280
+010F03FCC7FC010115E0D9000F01FCC8FC3C4F7CB543>I<EB3FF0B5FCA51203C6FCB3A4
+EE1FFC93B512C0030314F0030F8092391FE07FFC92393F001FFE037C8003F07FDAF1E081
+ECF3C0DAF7807F8502FFC7FC5CA25CA45CB3ACB6D8F807B612C0A542537BD24B>I<137F
+497E000313E0487FA2487FA76C5BA26C5BC613806DC7FC90C8FCADEB3FF0B5FCA512017E
+B3B3A6B612E0A51B547BD325>I<157FEDFF80020313E04A13F0A24A13F8A76E13F0A26E
+13E002001380ED7F0092C7FCADED1FF891B5FCA51401EC007FB3B3B1EA0780EA1FE0487E
+487E486C13FF16F0A216E05C16C04A13806C4848130049485A003F495A000FB512F06C5C
+0001148026001FFCC7FC256C87D329>I<EB3FF0B5FCA51203C6FCB3A54CB512F8A59339
+003FFE00EF1FF0EF3FC04D5A4DC7FCEE03FEEE07F84C5A4C5AEE7FC04CC8FC4B5A4B5AED
+0FF8ED1FE04B7E4B7EECF1FF02F37F02F77F91B6FC83159F030F7F02FE80DAF8077F4A7E
+6F7F6F7F83707E82707F84707F707F82707F84707F177F717E4D13C0B6D8F003B6FCA540
+537CD247>I<EB3FF0B5FCA512017EB3B3B3B1B612F0A51C537BD225>I<D93FF0D91FFCED
+FFE0B591B500C0010713FE030302F0011F6D7E030F6E017F8092271FE07FFCD9FF037F92
+2A3F001FFE01F8007F0003027C9126FF03E080C602F06DD90780137FDAF1E0038FC77FDA
+F3C0159EDAF7806D01BC143F07FC8102FFC75C4A5EA24A5EA44A5EB3ACB6D8F807B6D8C0
+3FB512FEA567367BB570>I<D93FF0EB1FFCB591B512C0030314F0030F8092391FE07FFC
+92393F001FFE0003027C80C602F07FDAF1E081ECF3C0DAF7807F8502FFC7FC5CA25CA45C
+B3ACB6D8F807B612C0A542367BB54B>I<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>I<D93FF8913801FFC0B50207B5FCA50003ED001FC61607B3AE5F
+A35FA2017F5D173B177B6D6C14F3DC01E313F06D6CD907C3EBFFC0903A0FFFC03F836D90
+B51203010114FE6D6C13F8020701E091C7FC42377BB54B>I<B600F00107B5FCA5000101
+F8C8EA7FE06C6DED3F00A2017F163E6E157E013F167C6E15FC6D5E6F13016D5E8117036D
+5E6F13076D5E6F130F6D5E6F131F6D93C7FC815F6E6C133E177E023F147C6F13FC6E5C16
+816E5C16C3A26EEBE3E016E76E5C16FF6E5CA26E91C8FCA26F5AA36F5AA26F5AA26F5AA2
+6F5A6F5A40367DB447>I<B6D8E07FB5D8C003B512C0A5000101F0C701F0C7381FF8006E
+027FED07E06C715DA26E023F150F017F705DA26E181F013F4B6C92C7FC6E606D70143E94
+B5FC6F177E6D4A6E137C03C001F315FC6D715B160303E001E114016D020702E05B03F013
+C06D71485A160F03F8D9807F13076D05F85B93381F003F03FC160F027F4902FC5BDBFE3E
+011F131F023F04FE90C8FC167EDBFF7C010F5B6E01FCECFF3E4C6D137E6E5FA24C7F6E5F
+4C7F6E5FA24C7F6E5F4C147FA26E5F93C8123F6F5EA2033E6FC9FC5A367DB461>I<007F
+B500F090387FFFFEA5C66C48C7000F90C7FC6D6CEC07F86D6D5C6D6D495A6D4B5A6F495A
+6D6D91C8FC6D6D137E6D6D5B91387FFE014C5A6E6C485A6EEB8FE06EEBCFC06EEBFF806E
+91C9FCA26E5B6E5B6F7E6F7EA26F7F834B7F4B7F92B5FCDA01FD7F03F87F4A486C7E4A48
+6C7E020F7FDA1FC0804A486C7F4A486C7F02FE6D7F4A6D7F495A49486D7F01076F7E4948
+6E7E49486E7FEBFFF0B500FE49B612C0A542357EB447>I<B600F00107B5FCA5C601F8C8
+EA7FE06EED3F00A26D6C153E187E013F167C6E15FC6D5E6F13016D5E6F13036D5E811707
+6D6D5C170F6D6D5C171F6D93C7FC6F5B027F143E6F137E023F147C6F13FCA26E6D5A1681
+6EEBC1F016C36E5C16E76E5C16FF6E5CA26E91C8FCA36F5AA26F5AA26F5AA26F5AA26F5A
+A35E150F5E151F93C9FC5DD81FC0133E486C137E486C137C486C13FC5D14015D14034A5A
+6C48485A49485A263FC07FCAFCEB81FE6CB45A6C13F000035BC690CBFC404D7DB447>I<
+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 D<B512FEA617067F961E>I<121E
+EA7F80A2EAFFC0A4EA7F80A2EA1E000A0A798919>I<ED0180ED03C01507A21680150FA2
+16005DA2151E153EA2153C157CA2157815F8A25D1401A25D1403A25D1407A25D140FA24A
+C7FCA2141E143EA2143C147CA2147814F8A25C1301A25C1303A25C1307A25C130FA291C8
+FC5BA2131E133EA25BA2137813F8A25B1201A25B1203A25B1207A25B120FA290C9FC5AA2
+121E123EA2123C127CA2127812F8A25A1260225B7BC32D>I<EB01FE90380FFFC090383F
+03F090387C00F849137C48487F48487F4848EB0F80A2000F15C04848EB07E0A3003F15F0
+A290C712034815F8A64815FCB3A26C15F8A56C6CEB07F0A3001F15E0A36C6CEB0FC0A26C
+6CEB1F80000315006C6C133E6C6C5B017C5B90383F03F090380FFFC0D901FEC7FC263F7D
+BC2D>I<EB01C013031307131F137FEA07FFB5FC139FEAF81F1200B3B3ACEB7FF0B612F8
+A31D3D78BC2D>I<EB07FC90383FFF8090B512E03903F01FF83907C007FC390F0001FE00
+1E6D7E001C1580003CEC7FC05AED3FE01270B4FC6DEB1FF07FA56C5A6CC7FC120CC813E0
+153FA216C0157F168015FF16004A5A5D4A5A4A5A5D4A5A4A5A4AC7FC147E147C5C495A49
+5A495A495A49C71270133E133C5B4914E0485A485A485A48C7120148B6FCA25A4815C0B7
+FCA3243D7CBC2D>I<EB07FC90383FFF809038F80FE03901E003F839078001FCD80F007F
+000E6D7E001E1580D81F80137F486C14C07FA27F5BA2121F6C5AC8138015FF1600A24A5A
+A24A5A5DEC07E04A5A023FC7FCEB1FFCECFF809038000FE0EC07F86E7E6E7E6E7E1680ED
+7FC0A216E0153FA216F0A2120C123F487E487EA316E0A249137F6CC713C01278EDFF807E
+6C4913006C495A3907C007FC3903F80FF0C6B55A013F1380D907F8C7FC243F7CBC2D>I<
+150E151E153EA2157EA215FE1401A21403EC077E1406140E141CA214381470A214E0EB01
+C0A2EB0380EB0700A2130E5BA25B5BA25B5B1201485A90C7FC5A120E120C121C5AA25A5A
+B8FCA3C8EAFE00AC4A7E49B6FCA3283E7EBD2D>I<00061403D80780131F01F813FE90B5
+FC5D5D5D15C092C7FC14FCEB3FE090C9FCACEB01FE90380FFF8090383E03E090387001F8
+496C7E49137E497F90C713800006141FC813C0A216E0150FA316F0A3120C127F7F12FFA4
+16E090C7121F12FC007015C012780038EC3F80123C6CEC7F00001F14FE6C6C485A6C6C48
+5A3903F80FE0C6B55A013F90C7FCEB07F8243F7CBC2D>I<EC1FE0ECFFF8903803F03E90
+380FC00F90391F000780133E017EEB1FC049133F4848137F12035B12074848EB3F80ED1F
+00001F91C7FC5BA2123FA3485AA214FE903887FF8039FF8F07E090389C01F09038B800FC
+01B0137E13F0497F16804914C0A2ED1FE0A34914F0A5127FA6123F6D14E0A2121FED3FC0
+A26C6C1480A20007EC7F006C6C137E6C6C5B6C6C485A90387E07F06DB45A010F1380D903
+FCC7FC243F7CBC2D>I<1238123C123F90B612FCA316F85A16F016E00078C712010070EC
+03C0ED078016005D48141E151C153C5DC8127015F04A5A5D14034A5A92C7FC5C141EA25C
+A2147C147814F8A213015C1303A31307A3130F5CA2131FA6133FAA6D5A0107C8FC26407B
+BD2D>I<EB03FC90381FFF8090387C07E09038F001F83901E0007C48487F48487F48C7FC
+ED0F80121E16C0003E1407A4123FA26DEB0F807F6C6C131F6D140001FC133E6C6C5B9038
+FF80786C6D5A6CEBF3E06CEBFF806C91C7FC133F6D13C06D7F013F13F801787F48486C7E
+3903E01FFF48486C1380260F800313C048487E489038007FE0003E143F007E141F007CEC
+0FF01507481403A31501A46C15E0007C1403A2007E15C06C14076CEC0F806DEB1F006C6C
+133ED807F05B3901FC03F86CB512E0011F1380D903FCC7FC243F7CBC2D>I<EB03FCEB1F
+FF90387E07C09038FC03F048486C7E48486C7E4848137C000F147E4848137F81003F1580
+5B007F15C0A2151F12FF16E0A516F0A5127F153FA36C7EA2001F147F120F6C6C13FF6D13
+DF000313013900F8039F90387E0F1FD91FFE13E0EB07F090C7FCA2ED3FC0A41680157FD8
+0F801400487E486C13FEA24A5A5D49485AEB8007391E000FE0001F495A260FC07FC7FC38
+03FFFE6C13F838003FC0243F7CBC2D>I<121EEA7F80A2EAFFC0A4EA7F80A2EA1E00C7FC
+B3121EEA7F80A2EAFFC0A4EA7F80A2EA1E000A2779A619>I<121EEA7F80A2EAFFC0A4EA
+7F80A2EA1E00C7FCB3121E127FEAFF80A213C0A4127F121E1200A412011380A312031300
+5A1206120E120C121C5A1230A20A3979A619>I<EB1FF890B5FC3903E01FC0390F0007F0
+001EEB03F848EB01FC4814FE140000FE14FF7E7FA46CC7FC123EC7EA01FEA2EC03FCEC07
+F815F0EC0FC0EC1F80EC3F00143E5C147814F85C13015CA2495AA25CAB91C7FC90C8FCA8
+EB0780EB1FE0A2497EA46D5AA2EB078020407BBF2B>63 D<15074B7EA34B7EA34B7EA34B
+7EA34B7E15E7A2913801C7FC15C3A291380381FEA34AC67EA3020E6D7EA34A6D7EA34A6D
+7EA34A6D7EA34A6D7EA349486D7E91B6FCA249819138800001A249C87EA24982010E157F
+A2011E82011C153FA2013C820138151FA2017882170F13FC00034C7ED80FFF4B7EB500F0
+010FB512F8A33D417DC044>65 D<B712FCEEFF8017F00001903980000FF86C6CC7EA03FE
+707E701380EF7FC0EF3FE0A2EF1FF0A218F8A3170F171FA318F0A2EF3FE0177F18C0EFFF
+804C1300EE03FCEE0FF8EE7FE091B6C7FC17E091C7EA07FCEE01FE933800FF80EF7FC0EF
+3FE0EF1FF018F8170F18FC1707A218FEA718FC170FA2EF1FF818F0173FEF7FE0EFFFC004
+03138048486C90380FFE00B85A17E094C7FC373E7DBD40>I<DB3FF01306912603FFFE13
+0E020F9038FF801E913A3FF007E03E9139FF8000F8D903FEC7EA7C7ED907F8EC1EFE4948
+140FD93FE0140749481403495A91C812014848150012034848167E5B000F173EA2484816
+1EA2123F5B180E127FA349160012FFAC127F7F180EA2123FA27F001F171E181C6C7EA200
+07173C6D16386C6C1678000117706C6C16F06EEC01E06D6C15C06D6C1403D90FF0EC0780
+6D6CEC1F00D903FE143E902600FF8013F891393FF007F0020FB512C0020391C7FC913800
+3FF037427BBF42>I<B712FCEEFF8017E000019039C0001FF86C6C48EB03FEEE00FF717E
+717EEF0FE084717E717E170184717EA21980187F19C0A3F03FE0A519F0AB19E0A5F07FC0
+A21980A218FF19004D5AA24D5A6017074D5A4D5AEF7FC04DC7FCEE03FE48486CEB1FF8B8
+5A178004FCC8FC3C3E7DBD45>I<B912E0A300019038C000016C6C48EB001FEF0FF01703
+A217011700A31870A41838161CA41800A2163CA2167C16FC150391B5FCA3EC8003150016
+7C163CA2161CA21807A3180E93C7FCA4181E181CA2183CA2187CA218F817011703170717
+1F48486CEB01FFB912F0A3383E7DBD3E>I<B91280A300019038C000036C6C48EB007FEF
+1FC0170F1707A21703A31701A4EF00E0A21638A31800A31678A216F81501150791B5FCA3
+EC8007150115001678A21638A693C8FCAF3801FFE0B612F0A3333E7DBD3B>I<DB3FE013
+0C912603FFFE131C021F9038FF803C913A7FF00FC07C9139FF0001F0D903FC90380078FC
+4948143DD91FE0141F4948140F4948140701FF15034890C8FC491501485A000716005B00
+0F177C5B001F173CA2485AA2181C127FA25B95C7FC12FFAB041FB512F0127FA26D913900
+0FFE00EF03FC123FA27F121FA26C7EA212077F12036C7E7F6C7F6D6C14076D7E6D6C140F
+D907F8141ED903FEEC3C7C902600FF80EBF83C913A7FF007F01C021FB5EAC00C020391C8
+FC9138003FF03C427BBF47>I<B6D8C01FB512F8A3000101E0C7383FFC0026007F80EC0F
+F0B3A691B7FCA30280C7120FB3A92601FFE0EC3FFCB6D8C01FB512F8A33D3E7DBD44>I<
+B612F0A3C6EBF000EB3FC0B3B3B2EBFFF0B612F0A31C3E7EBD21>I<011FB512FCA3D900
+0713006E5A1401B3B3A6123FEA7F80EAFFC0A44A5A1380D87F005B007C130700385C003C
+495A6C495A6C495A2603E07EC7FC3800FFF8EB3FC026407CBD2F>I<B600C090387FFFFC
+A3000101E0C7000F138026007F80913807FE0018F818E0604D5A4DC7FC173E5F5F4C5A4C
+5A4C5A4C5A4CC8FC163E5E5E4B5A4B5AED07804B7E151F4B7E4B7E15FF913881EFF89138
+83C7FCEC878791388F03FE91389E01FF14BCDAF8007F4A6D7E5C4A6D7E4A6D7EA2707E70
+7EA2707E707EA2707F717E84173F717E717EA2717E848419802601FFE04A13C0B600C090
+B6FCA3403E7DBD47>I<B612F8A3000101E0C9FC38007F80B3B0EF0380A517071800A45F
+A35FA25F5F5F4C5A160748486C133FB8FCA3313E7DBD39>I<B500C093383FFFF0A30001
+6D93387FF800D8007F18E0D977F016EFA3D973F8ED01CFA2D971FCED038FA3D970FEED07
+0FA26E150E80A26E6C141CA36E6C1438A26E6C1470A36E6C14E0A26E6CEB01C0A36E6CEB
+0380A36E6CEB0700A2037F130EA36F6C5AA26F6C5AA36F6C5AA25FED07F0A2923803F9C0
+A36FB45AA26F90C7FCA213F8486C147ED807FFEF3FF8B500F8013C011FB512F0A34C3E7D
+BD53>I<B56C91B512F88080D8007F030713006EEC01FC6E6E5A1870EB77FCEB73FEA2EB
+71FF01707FA26E7E6E7EA26E7E6E7EA26E7E6E7EA26E7E6E7FA26F7E6F7EA26F7E6F7EA2
+6F7E6F7EA26F7E6F1380A2EE7FC0EE3FE0A2EE1FF0EE0FF8A2EE07FCEE03FEA2EE01FF70
+13F0A2177F173FA2171F170FA2170701F81503487ED807FF1501B500F81400A218703D3E
+7DBD44>I<ED7FE0913807FFFE91391FC03F8091397E0007E04948EB03F8D907F0EB00FE
+4948147F49486E7E49486E7E49C86C7E01FE6F7E00018349150300038348486F7EA24848
+6F7EA2001F188049167F003F18C0A3007F18E049163FA300FF18F0AC007F18E06D167FA4
+003F18C0A26C6CEEFF80A36C6C4B1300A26C6C4B5A00035F6D150700015F6C6C4B5A6D5E
+6D6C4A5A6D6C4A5A6D6C4AC7FC6D6C14FED901FCEB03F8D9007FEB0FE091391FC03F8091
+2607FFFEC8FC9138007FE03C427BBF47>I<B712F8EEFF8017E000019039C0003FF86C6C
+48EB07FCEE01FE707EEF7F80EF3FC018E0A2EF1FF0A218F8A818F0A2EF3FE0A218C0EF7F
+80EFFF004C5AEE07FCEE3FF091B612C04CC7FC0280C9FCB3A73801FFE0B612C0A3353E7D
+BD3E>I<B712C016FCEEFF800001D9C00013E06C6C48EB1FF0EE07FCEE01FE707E84717E
+A2717EA284A760177F606017FF95C7FCEE01FCEE07F8EE1FE0EEFF8091B500FCC8FC16F0
+91388001FCED003FEE1FC0707E707E83160383160183A383A484A4F0C004190EA28218E0
+057F131E2601FFE0161CB600C0EB3FF094381FF83805071370CA3801FFE09438003F803F
+407DBD43>82 D<D907FC130C90391FFF801C017FEBF03C3901FC03F83A03F0007E7CD807
+C0EB1FFC4848130F001F140748C71203003E1401007E1400A2007C157C12FCA2163CA36C
+151CA27EA26C6C14007F7FEA3FF8EBFF806C13F86CEBFF806C14F06C14FC6C14FF6C15C0
+013F14E0010714F0EB007F020713F89138007FFC150FED07FE15031501ED00FFA200E015
+7FA3163FA27EA3163E7E167E6C157C6C15FC6C15F86D13016DEB03F06DEB07E0D8F9FCEB
+0FC03AF07F803F8090391FFFFE00D8E00713F839C0007FC028427BBF33>I<003FB91280
+A3903AF0007FE001018090393FC0003F48C7ED1FC0007E1707127C00781703A300701701
+A548EF00E0A5C81600B3B14B7E4B7E0107B612FEA33B3D7DBC42>I<B600C090B512F8A3
+000101E0C70007130026007F80EC01FC715A1870B3B3A4013F16F06E5DA21701011F5E80
+010F15036E4A5A010793C7FC6D6C5C6D6C141E6D6C5C027F14F86E6C485A91390FF00FE0
+0203B51280020049C8FCED1FF03D407DBD44>I<B691380FFFFEA3000301E0020113E06C
+01809138007F806CEF3F00017F163E181C6E153C013F1638A26E1578011F1670A26D6C5D
+A26E140101075EA26E140301035EA26D6C4AC7FCA2806D150EA26F131E027F141CA26F13
+3C023F1438A26E6C5BA26F13F0020F5CA2EDF80102075CA26E6C485AA2EDFE07020191C8
+FCA26F5A6E130EA2ED7F9CA216DCED3FF8A36F5AA36F5AA26F5AA36F5A3F407EBD44>I<
+B500FE017FB5D88007B5FCA3000301C0010101E0C713F86C90C849EC3FE07148EC0F807E
+7215006E143F017F190E84A26D6C60A24D7E6D6C60A2EFE7F86D6C60A2933801C3FC6E18
+F001076104037F6E0281140101036104077F17006D6C4D5AA2040EEB7F806D6C4DC7FCA2
+4CEB3FC0DA7F80160EA24CEB1FE003C0161E023F171C047814F0DBE070010F133C021F17
+3804F014F84C1307DA0FF05EA2DBF1C0EB03FCDA07F95EA2DBFB80EB01FEDA03FF6F5AA2
+93C8FCA26E5FA24B157F020094C8FCA24B81037C153EA20378151E0338151C58407EBD5D
+>I<007FB5D8C003B512E0A3C649C7EBFC00D93FF8EC3FE06D48EC1F806D6C92C7FC171E
+6D6C141C6D6C143C5F6D6C14706D6D13F04C5ADA7FC05B023F13036F485ADA1FF090C8FC
+020F5BEDF81E913807FC1C163C6E6C5A913801FF7016F06E5B6F5AA26F7E6F7EA2828215
+3FED3BFEED71FF15F103E07F913801C07F0203804B6C7EEC07004A6D7E020E6D7E5C023C
+6D7E02386D7E14784A6D7E4A6D7F130149486E7E4A6E7E130749C86C7E496F7E497ED9FF
+C04A7E00076DEC7FFFB500FC0103B512FEA33F3E7EBD44>I<B66C0103B51280A3000101
+F0C8EBF8006C6C48ED3FC0725A013F041EC7FC6D7E606D6C15386D6C1578606D6C5D6E14
+016D5E6D6D1303606E6C49C8FC6E6C5B170E6E6C131E171C6E6C5B6E6C137817706E6C13
+F06F5B6E13016EEB83C05FED7FC7DB3FE7C9FC16EFED1FFE5E150F6F5AB3A4ED1FFC020F
+B512FCA3413E7FBD44>I<EAFFFCA4EAF000B3B3B3B3ABEAFFFCA40E5B77C319>91
+D<486C13C00003130101001380481303000EEB070048130E0018130C0038131C00301318
+0070133800601330A300E01370481360A400CFEB678039FFC07FE001E013F0A3007F133F
+A2003F131F01C013E0390F0007801C1C73BE2D>I<EAFFFCA4EA003CB3B3B3B3ABEAFFFC
+A40E5B7FC319>I<EA0180120313005A120E5A12181238123012701260A312E05AA412CF
+EAFFC013E0A3127FA2123F13C0EA0F000B1C7ABE19>96 D<EB0FF8EBFFFE3903F01F8039
+078007E0000F6D7E9038E001F8D81FF07F6E7EA3157F6C5AEA0380C8FCA4EC1FFF0103B5
+FC90381FF87FEB7F803801FC00EA07F8EA0FE0485A485AA248C7FCEE038012FEA315FFA3
+007F5BEC03BF3B3F80071F8700261FC00E13CF3A07F03C0FFE3A01FFF807FC3A003FC001
+F0292A7DA82D>I<EA01FC12FFA3120712031201B1EC03FC91381FFF8091387C07E09039
+FDE001F09039FFC000FC4A137E91C77E49158049141F17C0EE0FE0A217F0A2160717F8AA
+17F0A2160FA217E0161F17C06D1580EE3F006D5C6E13FE9039F3C001F89039F1E003F090
+39E0780FC09026C03FFFC7FCC7EA07F82D407EBE33>I<49B4FC010F13E090383F00F801
+7C131E4848131F4848137F0007ECFF80485A5B121FA24848EB7F00151C007F91C7FCA290
+C9FC5AAB6C7EA3003FEC01C07F001F140316806C6C13076C6C14000003140E6C6C131E6C
+6C137890383F01F090380FFFC0D901FEC7FC222A7DA828>I<ED01FC15FFA31507150315
+01B114FF010713E190381F80F990387E003D49131FD803F81307485A4913034848130112
+1F123F5B127FA290C7FCA25AAA7E7FA2123FA26C7E000F14037F000714076C6C497E6C6C
+497ED8007C017913F890383F01F190380FFFC1903A01FE01FC002D407DBE33>I<EB01FE
+90380FFFC090383F03F09038FC01F848486C7E4848137E48487F000F158049131F001F15
+C04848130FA2127F16E090C7FCA25AA290B6FCA290C9FCA67EA27F123F16E06C7E150100
+0F15C06C6C13036DEB07806C6C1400C66C131E017E5B90381F80F8903807FFE0010090C7
+FC232A7EA828>I<EC1FC0EC7FF8903801F83C903807E07E90380FC0FFEB1FC1EB3F8114
+01137FEC00FE01FE137C1500AEB6FCA3C648C7FCB3AE487E007F13FFA320407EBF1C>I<
+167C903903F801FF903A1FFF078F8090397E0FDE1F9038F803F83803F001A23B07E000FC
+0600000F6EC7FC49137E001F147FA8000F147E6D13FE00075C6C6C485AA23901F803E039
+03FE0FC026071FFFC8FCEB03F80006CAFC120EA3120FA27F7F6CB512E015FE6C6E7E6C15
+E06C810003813A0FC0001FFC48C7EA01FE003E140048157E825A82A46C5D007C153E007E
+157E6C5D6C6C495A6C6C495AD803F0EB0FC0D800FE017FC7FC90383FFFFC010313C0293D
+7EA82D>I<EA01FC12FFA3120712031201B1EC01FE913807FFC091381E07E091387803F0
+9138E001F8D9FDC07F148001FF6D7E91C7FCA25BA25BB3A6486C497EB5D8F87F13FCA32E
+3F7DBE33>I<EA01E0EA07F8A2487EA46C5AA2EA01E0C8FCACEA01FC127FA31207120312
+01B3AC487EB512F0A3143E7DBD1A>I<1478EB01FEA2EB03FFA4EB01FEA2EB00781400AC
+147FEB7FFFA313017F147FB3B3A5123E127F38FF807E14FEA214FCEB81F8EA7F01387C03
+F0381E07C0380FFF803801FC00185185BD1C>I<EA01FC12FFA3120712031201B292B512
+80A392383FFC0016E0168093C7FC153C5D5D4A5AEC07C04A5A4AC8FC143E147F4A7E13FD
+9038FFDFC0EC9FE0140F496C7E01FC7F496C7E1401816E7E81826F7E151F826F7EA28248
+6C14FEB539F07FFFE0A32B3F7EBE30>I<EA01FC12FFA3120712031201B3B3B1487EB512
+F8A3153F7DBE1A>I<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>I<D801FC14
+FE00FF147FA3000714030003140100011400B3A51501A31503120015076DEB06FF017E01
+0E13806D4913FC90381FC078903807FFE00100903880FE002E297DA733>I<B539E00FFF
+E0A32707FE000313006C48EB00FC5E00015D7F00005DA26D13016D5CA26D6C485AA2ECC0
+07011F91C7FCA290380FE00EA2ECF01E0107131CA26D6C5AA2ECFC7801011370A2ECFEF0
+01005BA2EC7FC0A36E5AA26EC8FCA3140E2B287EA630>I<B53BC3FFFE03FFF8A3290FFE
+003FE00013C06C486D48EB3F806C4817006D010F141E00016F131C15076D163C00004A6C
+1338A2017F5E4B7E151DD93F805DED3DFC1538D91FC04A5AED78FE9238707E03D90FE001
+7F5BEDE03F02F0140701070387C7FC9138F1C01F02F9148F010315CE9138FB800F02FF14
+DE6D15FCED00076D5DA24A1303027E5CA2027C1301023C5C023813003D287EA642>I<B5
+39F01FFFE0A30003D9C00F1300C690388007F8D97F0013E002805BD93FC05B011F49C7FC
+90380FE00EECF01E6D6C5A01035B6D6C5A6E5AEB00FF6E5A6E5A81141F814A7E81147BEC
+F1FC903801E1FEECC0FF01037F49486C7ED90F007F011E6D7E013E130F496D7E01FC8048
+6C80000F4A7EB539803FFFF8A32D277FA630>I<B539E00FFFE0A32707FE000313006C48
+EB01FC6F5A00015D7F00005DA2017F495AA2EC8003013F5CA26D6C48C7FCA26E5A010F13
+0EA26D6C5AA2ECF83C01031338A26D6C5AA2ECFEF001005BA2EC7FC0A36E5AA36EC8FCA2
+140EA2141E141C143C1438A2147800181370127EB45BA2495AA248485AD87E07C9FCEA78
+0EEA3C3CEA1FF8EA07E02B3A7EA630>I<001FB61280A2EBE0000180140049485A001E49
+5A121C4A5A003C495A141F00385C4A5A147F5D4AC7FCC6485AA2495A495A130F5C495A90
+393FC00380A2EB7F80EBFF005A5B484813071207491400485A48485BA248485B4848137F
+00FF495A90B6FCA221277EA628>I<B812F0A22C0280982D>I<BE12C0A25A0280985B>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fw cmbx12 20.736 19
+/Fw 19 120 df<BDFC1CFCF4FFC01DF81DFF1EC01EF88AC7003F91C96C14FF090315C0E1
+007F800A0F14F80A03800A00800B3F7F7780778077800B018077808C8A787F787FA27880
+8D8A8D8A8D8A8DA28D8AA28DA28BA28DA42280A38BA322C0B22280A367A32200A4699CB5
+FCA269A3545CA2696669666966695491C7FC6668545B9BB55A65535C535C535C0B3F5C9A
+B6C8FC5214FC0A0F5C0A3F5C0903B612C0097F5DBF48C9FC1EF81EE01E800BFCCAFC1DE0
+52CBFC99CCFC82767AF594>68 D<BF12FCA48AA4C7003F0280C8123F1B01F3003F1C0776
+7F1C008989898989A2891F8089A289A31E7FA21FC0A21E3FA3F20FF0A3F61FE0A49BC7FC
+A21A1FA31A3FA21A7FA21AFF1903190F197F94B7FCA8943880007F190F190319001A7FA2
+1A3FA21A1FA31A0FA997CBFCB3A9BBFCA86B757AF47A>70 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 D<F37F80922607FFFC913807FFE092B600E001
+1F13F8020703FC017F13FC021FDBFF01B512FE027F16C349B800F7EBBFFF49DA803F9038
+FFF83F010F9026FC000714C04901F00101EC007F49496D148049496E6D7E90B517E04B6E
+15FE48F1F01F4891C86C9038F80FFCF307F098C7FC48496F7FA34885AB6C61A36C6D4B5B
+A36C6E4A5B6C616F5C6D606D6D91B55A6D6D4991C8FC6D01FC01075B9226FF803F13F893
+B65A4917C0D93F1F93C9FC020715FCD97E0015E0030701FCCAFC01FE90CDFCA412017FA2
+80A280808014FE6C90B812C019FF1AF01AFC6DF0FF801BE06D851BFC6D856D856D1A806D
+1AC05B011F1AE0137F48BC12F0000701FCC9FC4801E0040314F84849EE007F4849171F91
+CB1207487313FC5B00FF855B86A56D60007F1BF86D60A26C6D4D13F06E5F6C6D4D13E06C
+6D4D13C06C01FC94B512806C01FF04031400C602C0030F13FC6D01F8037F5B011FD9FFE0
+011FB512E0010791B8128001014EC7FC6D6C17F8020F17C0DA007F03F8C8FC03014AC9FC
+58727BCE61>103 D<903801FFFCB6FCA8C67E131F7FB3AD95380FFFE095B512FE05036E
+7E050F15E0053F15F84D81932701FFF01F7F4CD900077FDC07FC6D80DC0FF06D80DC1FC0
+7F4C48824CC8FC047E6F7F5EEDFDF85E03FF707F5EA25EA25EA293C9FCA45DB3B3A6B8D8
+E003B81280A8617879F76C>I<EB01FCEB07FF011F13C0497F497F90B57EA24880A24880
+A76C5CA26C5CA26D5B6D5B6D5B010790C8FCEB01FC90CAFCB2903801FFFC007FB5FCA8C6
+7E131F7FB3B3B3A5B81280A8297979F835>I<EE01FCEE07FF041F13C04C13E04C13F093
+B512F8A24B14FCA24B14FEA76F14FCA26F14F8A27013F07013E07013C004071300EE01FC
+93C8FCB2EFFFFE92B6FCA8ED003F160F82B3B3B3B3A3EA01FCEA07FF487F487F487F486D
+15FC5EB57EA218F85E18F018E05E6C494913C018804A90B512006C4A5B6C49485B6CD9E0
+1F5B6C90B612E06C5EC693C7FC013F14F8010F14C09026007FFCC8FC379B8BF83B>I<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>I<DAFFFE933803FFF8B603
+03B6FCA8C66CEE0001011F717E6D84B3B3A862A497B5FCA261A2616D5F1ADF6F150F6DEF
+1F9F073F806D6EDA7F1F13FF6D6ED901FEEDFF8070EB07FC023F01FEEB3FF86E90B612F0
+6E16C0020316800200EDFE00031F14F80300028003C0C7FC614F79CD6C>I<B7D8FE01B7
+00F00103B612E0A8D8003F01FCC8003F01E0C80007EBE0006D0B0090C7FC6F6F6D5DA26D
+666F6F6D15036D66701A07737F6D667070150F6D4D60701A1F876D4D607071143F6E4C60
+701A7F886E4C607003BF6D14FF6E04FF95C8FC6670031F7F6E4B60704A6C6D130318036E
+640580496C6D13076E03076005C0180F4F6C7F6E030F6005E0496C6D131F6E031F6005F0
+183F4F6C14806F023F6005F8496DEBC07F6F027F6005FC18FF4F6D7F6F02FF95C9FC7190
+C76C13F16F90B55F1DF34E6E13FB6F624E6E13FFA26F624E806F62A24E806F624E807061
+A24E8170614E817096CAFCA295C97E70604D160F0407604D16077048705A834E7CCC8C>
+119 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fx cmr10 10 1
+/Fx 1 112 df<EB03FE90380FFF8090383E03E09038F800F84848137C48487F48487F48
+48EB0F80001F15C090C712074815E0A2007EEC03F0A400FE15F8A9007E15F0A2007F1407
+6C15E0A26C6CEB0FC0000F15806D131F6C6CEB3F006C6C137EC66C13F890387E03F09038
+1FFFC0D903FEC7FC25277EA52A>111 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
+({<return>}?)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({<return>})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 @{<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) @}
+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{@{<return>@}} 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 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<!--Converted with LaTeX2HTML 98.1p1 release (March 2nd, 1998)
+originally by Nikos Drakos (nikos@cbl.leeds.ac.uk), CBLU, University of Leeds
+* revised and updated by:  Marcus Hennecke, Ross Moore, Herb Swan
+* with significant contributions from:
+  Jens Lippmann, Marek Rouchal, Martin Wilck and others -->
+<HTML>
+<HEAD>
+<TITLE>Release NoticeBlueGnu Testing Framework
+Version 2.0.3</TITLE>
+<META NAME="description" CONTENT="Release NoticeBlueGnu Testing Framework
+Version 2.0.3">
+<META NAME="keywords" CONTENT="READMEdvi">
+<META NAME="resource-type" CONTENT="document">
+<META NAME="distribution" CONTENT="global">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<LINK REL="STYLESHEET" HREF="READMEdvi.css">
+</HEAD>
+<BODY >
+
+<IMG WIDTH="37" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="next"
+ SRC="/tools/latex2html-98.1p1/icons.gif/next_motif_gr.gif"> 
+<IMG WIDTH="26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up"
+ SRC="/tools/latex2html-98.1p1/icons.gif/up_motif_gr.gif"> 
+<IMG WIDTH="63" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="previous"
+ SRC="/tools/latex2html-98.1p1/icons.gif/previous_motif_gr.gif">   <BR>
+<BR> <P>
+
+<!--End of Navigation Panel-->
+
+<P>
+
+<P>
+<H1 ALIGN="CENTER">Release Notice
+<BR>
+BlueGnu Testing Framework
+<BR>
+Version 2.0.3</H1>
+<P ALIGN="CENTER"><STRONG>Jan-Willem Neurdenburg
+<BR>
+jotOmega dsc
+<BR>
+56 Brigham Hill Road
+<BR>
+Grafton&nbsp;MA&nbsp;&nbsp;01519-1135
+<BR>
+neurdenburgj@acm.org
+<BR>
+Tel: (508) 839-0276
+<BR>
+Fax: (508) 839-7267</STRONG></P>
+<P ALIGN="LEFT"></P>
+
+<P>
+
+<H1><A NAME="SECTION00010000000000000000">
+Introduction</A>
+</H1>
+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:
+
+<P>
+<UL>
+<P>
+<LI>The flexibility and consistency of the BlueGnu framework makes it
+easy to write tests for any program, with the exception of GUI
+applications.
+
+<P>
+<LI>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.
+
+<P>
+<LI>BlueGnu is written in [incr Tcl], which in turn is based on Tcl
+(Tool Command Language). The framework comprises two parts:
+<DL COMPACT>
+<DT>1.
+<DD>the testing framework,
+<DT>2.
+<DD>the test-suites or test-sets themselves.
+</DL>
+<P>
+<LI>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.
+
+<P>
+<LI>Includes DejaGnu release 1.6
+
+<P>
+</UL>
+<P>
+
+<H1><A NAME="SECTION00020000000000000000">
+Requirements</A>
+</H1>
+The following modules should have been installed, before you can
+install and/or use BlueGnu:
+
+<P>
+<UL>
+<LI>Tcl release 8.0 or higher,
+<LI>incr Tcl release 3.0 or higher.
+</UL>
+<P>
+Any other extensions that is compatible with Tcl release 8.0 can be used
+as well.
+
+<P>
+
+<H1><A NAME="SECTION00030000000000000000">
+Structure and Contents of the Release</A>
+</H1>
+
+<P>
+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.
+
+<P>
+The top-level directories are listed below:
+
+<P>
+<DL>
+<DT><STRONG>lib:</STRONG>
+<DD>the packages and procedures that make the BlueGnu and
+DejaGnu testing framework. This also includes the default target
+definition files.
+<P>
+<DT><STRONG>testsets:</STRONG>
+<DD>the BlueGnu test-suites and test examples. It contains
+the following subdirectories.
+
+<P>
+<DL>
+<DT><STRONG>BlueGnu:</STRONG>
+<DD>test scripts to test the testing framework itself.
+<P>
+<DT><STRONG>examples:</STRONG>
+<DD>test suite and test script examples.
+
+<P>
+<DT><STRONG>config, lib, tools:</STRONG>
+<DD>currently empty, but can be used for
+test-set dependent configuration files, library files, and tools.
+</DL>
+<P>
+<DT><STRONG>config:</STRONG>
+<DD>currently empty.
+
+<P>
+<DT><STRONG>doc:</STRONG>
+<DD>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.
+
+<P>
+It also contains
+the T<SMALL>E</SMALL>X 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.
+
+<P>
+<DT><STRONG>testsuite:</STRONG>
+<DD>contains a mixture of DejaGnu and BlueGnu test
+scripts.
+
+<P>
+<DT><STRONG>contrib:</STRONG>
+<DD>contains examples how DejaGnu is used at Cygnus.
+
+<P>
+<DT><STRONG>example:</STRONG>
+<DD>contains a full DejaGnu test framework example for testing the program 'calc' which is also included.
+
+<P>
+</DL>
+<P>
+
+<H1><A NAME="SECTION00040000000000000000">
+Installation and use under Unix</A>
+</H1>
+
+<P>
+Before you can install and use BlueGnu you need to have installed the
+following three packages:
+<UL>
+<LI>Tcl version 8.0.3
+<LI>Tk version 8.0.3
+<LI>incr Tcl version 3.0.1
+</UL>The source for these packages should all be located in one directory.
+The subdirectory in the directory should be:
+<UL>
+<LI>tcl8.0.3
+<LI>tk8.0.3
+<LI>itcl3.0.1
+</UL>
+<P>
+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''.
+
+<P>
+
+<H2><A NAME="SECTION00041000000000000000">
+Installation of needed Packages</A>
+</H2>
+
+<P>
+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''.
+
+<P>
+From the directory ``TclTk'', you should do the following to install
+the packages:
+
+<P>
+<PRE>
+% 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
+</PRE>
+<P>
+
+<H2><A NAME="SECTION00042000000000000000">
+Installing BlueGnu</A>
+</H2>
+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:
+
+<P>
+<PRE>
+% cd bluegnu2.0.3
+% ./configure --prefix=/tools/bluegnu2.0.3
+% make
+% mkdir /tools/bluegnu2.0.3
+% make install
+</PRE>
+<P>
+This will install BlueGnu in the directories:
+<UL>
+<LI>/tools/bluegnu2.0.3/bin
+<LI>/tools/bluegnu2.0.3/lib/bluegnu
+<LI>/tools/bluegnu2.0.3/info
+<LI>/tools/bluegnu2.0.3/man
+</UL>
+<P>
+
+<H2><A NAME="SECTION00043000000000000000">
+Using BlueGnu</A>
+</H2>
+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:
+
+<P>
+<PRE>
+% bluegnu versionTcl.itcl
+% bluegnu ts_001
+% bluegnu ts_002
+% bluegnu ts_003
+</PRE>
+<P>
+The above test result should all be PASS. The following test will give
+a result UNKNOWN, because no pass/fail instruction have been given.
+
+<P>
+<PRE>
+% bluegnu tc001
+</PRE>
+<P>
+The last test you can run will fail in its simple form:
+
+<P>
+<PRE>
+% bluegnu tc002
+</PRE>
+<P>
+But will pass if you execute the test as follows:
+
+<P>
+<PRE>
+% bluegnu tc002[English]
+</PRE>
+<P>
+This is because the test scripts need a test case identifier to find
+the correct benchmark code.
+
+<P>
+
+<H1><A NAME="SECTION00050000000000000000">
+Changes</A>
+</H1>
+
+<H2><A NAME="SECTION00051000000000000000">
+Version 2.0.3</A>
+</H2>
+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<code>_</code>001, ts<code>_</code>002, and
+ts<code>_</code>003. The first two are not as easy to write as the
+third. The test suite ts<code>_</code>001 is a script implementation of the
+command line:
+<PRE>
+% cd bluegnu2.0.3/testsets
+% bluegnu examples/tc002[English=B] \
+&gt; "examples/tc002[Dutch=B]={MSG=Hallo Wereld}"
+</PRE>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<code>_</code>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<code>_</code>003.
+
+<P>
+Changes like this will be made in the future!
+
+<P>
+
+<H1><A NAME="SECTION00060000000000000000">
+Future Enhancements</A>
+</H1>
+The following enhancements are being planned:
+<UL>
+<LI>Target code will be made into a class with methods 'start',
+'load', 'exit', and 'version'. Instead of the current
+'&lt;target&gt;<code>_</code>start', '&lt;target&gt;<code>_</code>load', '&lt;target&gt;<code>_</code>exit', and
+'&lt;target&gt;<code>_</code>version', which have been taken from DejaGnu.
+
+<P>
+<LI>Procedures will be created that make it easy to test WEB
+application from the framework.
+
+<P>
+<LI>Other enhancements will be made depending on the use of the
+framework in testing different applications.
+</UL>
+<H1><A NAME="SECTION00070000000000000000">
+  About this document ... </A>
+</H1> 
+ <STRONG>Release Notice
+<BR>
+BlueGnu Testing Framework
+<BR>
+Version 2.0.3</STRONG><P>
+This document was generated using the
+<A HREF="http://www-dsed.llnl.gov/files/programs/unix/latex2html/manual/"><STRONG>LaTeX</STRONG>2<tt>HTML</tt></A> translator Version 98.1p1 release (March 2nd, 1998)
+<P>
+Copyright &#169; 1993, 1994, 1995, 1996, 1997,
+<A HREF="http://cbl.leeds.ac.uk/nikos/personal.html">Nikos Drakos</A>, 
+Computer Based Learning Unit, University of Leeds.
+<P>
+The command line arguments were: <BR>
+ <STRONG>latex2html</STRONG> <tt>-t BlueGnu Release Notice -split 0 READMEdvi.tex</tt>.
+<P>
+The translation was initiated by Jan-Willem Neurdenburg on 1999-09-19<HR>
+<IMG WIDTH="37" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="next"
+ SRC="/tools/latex2html-98.1p1/icons.gif/next_motif_gr.gif"> 
+<IMG WIDTH="26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up"
+ SRC="/tools/latex2html-98.1p1/icons.gif/up_motif_gr.gif"> 
+<IMG WIDTH="63" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="previous"
+ SRC="/tools/latex2html-98.1p1/icons.gif/previous_motif_gr.gif">   <BR>
+
+<!--End of Navigation Panel-->
+<ADDRESS>
+<I>Jan-Willem Neurdenburg <BR>
+1999-09-19</I>
+</ADDRESS>
+</BODY>
+</HTML>
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
Binary files differ
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 df<F001C0F007E0181FF07FC0943801FF00EF07FCEF1FF0EF7FC04C48C7FCEE
+0FFCEE3FF0EEFFC0030390C8FCED0FF8ED3FE0EDFF80DA03FEC9FCEC1FF8EC7FE0903801
+FF80D907FECAFCEB1FF0EB7FC04848CBFCEA07FCEA1FF0EA7FC048CCFCA2EA7FC0EA1FF0
+EA07FCEA01FF38007FC0EB1FF0EB07FE903801FF809038007FE0EC1FF8EC03FE913800FF
+80ED3FE0ED0FF8ED03FF030013C0EE3FF0EE0FFCEE01FF9338007FC0EF1FF0EF07FCEF01
+FF9438007FC0F01FE01807F001C03B3878B44C>60 D<127012FCB4FCEA7FC0EA1FF0EA07
+FCEA01FF38007FC0EB1FF0EB07FE903801FF809038007FE0EC1FF8EC03FE913800FF80ED
+3FE0ED0FF8ED03FF030013C0EE3FF0EE0FFCEE01FF9338007FC0EF1FF0EF07FCEF01FF94
+38007FC0F01FE0A2F07FC0943801FF00EF07FCEF1FF0EF7FC04C48C7FCEE0FFCEE3FF0EE
+FFC0030390C8FCED0FF8ED3FE0EDFF80DA03FEC9FCEC1FF8EC7FE0903801FF80D907FECA
+FCEB1FF0EB7FC04848CBFCEA07FCEA1FF0EA7FC048CCFC12FC12703B3878B44C>62
+D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fb cmtt12 12 48
+/Fb 48 126 df<00085B003EEB07C0007FEB0FE0A24814F0A26C14E0B3A2007E1307003E
+14C0A20008EB01001C1E75BD33>34 D<D803E0143CD80FF8147C486C14FEA2486C1301A2
+D87F7F495AEA7E3F5E00FEEB8007EAFC1F5E150FA24B5AA25ED8FE3F133F007E13004B5A
+EA7F7FD83FFE91C7FC5D6C5A5D380FF801EA03E0C7485AA25D1407A24A5AA25D141FA24A
+5AA25D147FA292C8FC5CA2495AA25C1303A2495A167C4A48B4FC010F491380A24A4813C0
+131F92380FEFE0D93FC013C7031F13F002801383137FA2EBFF00A25B1201A24914C70003
+020F13E016EF4848903807FFC0A2496D1380A26C486D13000001EC007C2C4D7DC433>37
+D<007FB612FEA2B8FCA36C15FEA228077BA133>45 D<121FEA3F80EA7FC0EAFFE0A5EA7F
+C0EA3F80EA1F000B0B6C8A33>I<167816F8ED01FCA21503A2ED07F8A2ED0FF0A2ED1FE0
+A216C0153FA2ED7F80A2EDFF00A24A5AA25D1403A24A5AA24A5AA24A5AA25D143FA24A5A
+A24AC7FCA2495AA25C1303A2495AA2495AA25C131FA2495AA2495AA249C8FCA25B1201A2
+485AA2485AA2485AA25B121FA2485AA2485AA248C9FCA25AA2127CA2264D7AC433>I<14
+FF010313C0010F13F0497F497F497F9038FF81FF3A01FE007F804848EB3FC049131F4848
+EB0FE0A24848EB07F0A24848EB03F8A24848EB01FCA348C812FEA4007E157E00FE157FAE
+6C15FF6C15FEA46D1301003F15FCA26D1303001F15F8A26C6CEB07F0A26C6CEB0FE06D13
+1F6C6CEB3FC0A26CB4EBFF806C018113006DB45A6D5B6D5B6D5B010313C0010090C7FC28
+3F7BBD33>I<EB01E0497EA21307A2130FA2131F133F137F13FF1203123F5AEAFFF713E7
+1387EA7E071200B3B3A2003FB512FE48801680A216006C5C213E76BD33>I<EB03FF011F
+13E0017F13FC48B57E48ECFF804815C0260FFE0313E03A1FF0007FF049EB1FF84848130F
+49EB03FC127F90C7EA01FE4814005A6C15FF167FA3127E123CC9FCA216FF16FEA2150116
+FC150316F81507ED0FF0ED1FE0153F16C0ED7F80EDFF004A5AEC07FC4A5A4A5A4A5A4A5A
+4A5A4990C7FC495AEB07F8EB1FF0495A495A495A4890C8FC4848143E4848147FEA0FF048
+5A48B7FCB8FCA37E6C15FE283E7BBD33>I<903801FFC0010F13F8013F13FE90B67E4881
+4881489038807FF03A0FFC000FF801F06D7E484813036F7EA21500A26C5A6C5AC9FC1501
+5EA215034B5A150F4B5A4B5A913803FFC00103B55A4991C7FC5D8116C06D8090C76C7EED
+0FF8ED03FC6F7E6F7E821780163FA2EE1FC0A3123C127EB4FCA2163F1780167F6C16006D
+5C6D495A6C6C1303D81FF8EB0FFC3A0FFF807FF86C90B55A6C5D6C15806C6C91C7FC010F
+13FC010113C02A3F7CBD33>I<ECFFC0010713F8011F13FE017F6D7E90B67E4881489038
+807FF03A07FE001FF8D80FF8EB07FC49130348486D7E491300003F814980A66C6C14FEA2
+6C6C495A6D13036C6C495AD803FEEB1FF03A01FF807FE06C90B55A013F91C7FC010F13FC
+A2013F13FF90B612C0489038807FE03A07FC000FF848486D7ED81FE0EB01FE4913004848
+147F007F168090C8123FA200FEED1FC0A76C153F6C16806D147F003F16006D5C6C6C495A
+01F813076C6C495A3A07FF807FF86C90B55A6C5D6C6C14806D91C7FC010713F8010013C0
+2A3F7CBD33>56 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>I<D83FF8EC1FFC486CEC3FFE486CEC7FFFA2007F16
+FE6C6CECFFFC000716E001EF14F7EC8001A39039E7C003E7A3ECE007A201E314C7A2ECF0
+0FA201E11487ECF81FA201E01407A2ECFC3FA2EC7C3E157E147EEC3E7CA3EC1E78EC1FF8
+A2EC0FF0A3EC07E0EC03C091C7FCAED83FFCEC3FFC486CEC7FFEB591B5FCA26C48EC7FFE
+6C48EC3FFC303D7FBC33>77 D<D907FE137890393FFFC07C90B5EAF0FC4814FC000714FF
+5AEBFC03391FF0007F4848133F0180131F007F140F90C712074814035AA21501A46CEC00
+F86C15007F7F6C7E7FEA1FFE380FFFE06C13FF6C14F06C14FC6C6C13FF011F1480010314
+C0D9003F13E0020313F09138003FF8ED0FFC1507ED03FE1501150016FFA2007C157F12FE
+A56C15FF16FE7FED01FC6D130301F0EB07F801FC130F9039FF807FF091B512E016C000FC
+1580013FEBFE00D8F80F5BD8780013E0283F7BBD33>83 D<003FB712F84816FCB8FCA43A
+FE000FE001A8007CED00F8C71500B3B3A40107B512C049804980A26D5C6D5C2E3D7EBC33
+>I<D83FFCEC3FFC486CEC7FFEB591B5FCA26C48EC7FFE6C48EC3FFCD80FC0EC03F0A76D
+1407000716E0A86C6CEC0FC0A2EC07E0EC0FF0EC1FF8A3000116809039F83FFC1FEC3E7C
+A4EC7E7EA200001600A2EC7C3E01FC5CECFC3FA3ECF81F017C143EA590397DF00FBEA301
+3D14BC90393FE007FCA5ECC003011F5C6D486C5A303E7FBC33>87
+D<007FB512C0B612E0A415C048C8FCB3B3B3ABB612C015E0A46C14C01B4D6CC433>91
+D<127CA212FEA27EA26C7EA26C7EA26C7EA2120F7FA26C7EA26C7EA26C7EA212007FA26D
+7EA26D7EA26D7EA2130F80A26D7EA26D7EA2130180A26D7EA26E7EA26E7EA2141F81A26E
+7EA26E7EA26E7EA2140181A26E7EA2ED7F80A2ED3FC0A2151F16E0A2ED0FF0A2ED07F8A2
+ED03FCA21501A2ED00F81678264D7AC433>I<007FB512C0B612E0A47EC7120FB3B3B3AB
+007FB5FCB6FCA46C14C01B4D7DC433>I<007FB612FEA2B8FCA36C15FEA228077B7D33>
+95 D<EB1FFC90B57E000314E048804814FC48809038F007FFEBE0016E7F153F6C48806C
+48131FC87F150FA5EC0FFF49B5FC131F137F48B6FC0007140F4813C0381FFC00EA3FF0EA
+7FC05B48C7FC5AA56C141F7E6D137FD83FE0497ED9F807EBFFF06CB712F87E6C14F36C14
+C1C69138003FF0D91FF090C7FC2D2E7BAC33>97 D<EA3FFC487E12FFA2127F123F1200AB
+EC01FE91380FFFC04A13F0027F7F91B512FE90B7FCECFE07DAF800138002E0EB7FC04AEB
+3FE04A131FEE0FF091C7FC16074915F81603A217FC1601A9160317F8A26D140717F06E13
+0F17E06E131FEE3FC06E137F9139F801FF80DAFE07130091B55A495C6E5BD97E3F13E0D9
+3C0F138090260003FEC7FC2E3E7FBC33>I<ECFFF0010713FE011FEBFF804914C04914E0
+48B612F048EBC01F9038FE000F485A485A4848EB07E049EB03C0484890C7FC5BA2127F90
+C9FCA25A5AA97E7EA27F003FEC01F06DEB03F86C7E6D13076C6C14F06C6C130F01FFEB1F
+E06CEBE07F6C90B512C06C1580013F14006D13FC01075B010013C0252E79AC33>I<ED7F
+F84B7E5CA280157F1501ABEB01FF010713C1011F13F1017F13F990B6FC5A4813813907FE
+003FD80FF8131F49130F48481307491303123F491301127F90C7FCA25A5AA97E7E15037F
+123F6D1307A26C6C130F6D131F6C6C133F6C6C137F2603FF81B512F091B612F8C602FD13
+FC6D13F96D01E113F8010F018013F0D901FEC8FC2E3E7DBC33>I<ECFF80010713F0011F
+13FC497F90B6FC48158048018013C03A07FE003FE001F8EB0FF048481307484814F84913
+03003F15FC491301127F90C7FC16FE15005A5AB7FCA516FC48C9FC7E7EA36C7E167C6C6C
+14FE7F6C7E6D13016C6CEB03FC6CB4130F6C9038C03FF86C90B512F06D14E06D14C0010F
+1400010313FC9038007FE0272E7BAC33>I<ED3FE0913801FFFC020713FE141F4A13FF5C
+ECFFC015004948137E4A133C010314005CA8003FB612F84815FCB7FCA36C15F8260003F8
+C7FCB3AD003FB612804815C0A46C1580283E7DBD33>I<D901FEEB1FE0903A0FFFC0FFF0
+013F01F313F84990B512FC90B7FC5A48010313E12607FC00EB80F849017F136048489038
+3FC00049131FA2001F8149130FA66D131F000F5DA26D133F6C6C495A6D13FF2603FF0390
+C7FCECFFFE485C5D5DD80FCF13C0D981FEC8FC0180C9FCA27FA26C7E7F90B512FC6CECFF
+C06C15F0000715FC4815FF4816809038E0000748489038007FC090C8EA1FE048150F007E
+150700FE16F0481503A56C1507007E16E0007F150F6C6CEC1FC001E0147FD81FF8903801
+FF80270FFF801F13006C90B55A6C5DC615F0013F14C0010F91C7FC010013F02E447DAB33
+>I<EA3FFC487E12FFA2127F123F1200AB4AB4FC020713C0021F13F0027F7F91B5FC90B6
+7EED07FEECF801ECF0004A7F4A7F5CA291C7FCA35BB3A43B3FFFF80FFFFC486D4813FEB5
+6C4813FFA26C496C13FE6C496C13FC303D7FBC33>I<14E0EB03F8A2497EA36D5AA2EB00
+E091C8FCAA383FFFF8487FA47EEA0001B3AD007FB612C0B712E016F0A216E06C15C0243E
+78BD33>I<EA7FF8487EA4127F1200AC4AB512C04A14E04A14F0A26E14E06E14C0913900
+0FF0004B5A4B5A4B5A4BC7FC4A5A4A5A4A5A4A5A4A5A4A5A4A5A4A7E01FD7F90B5FC81EC
+F3F8ECE3FC14C1EC80FEEC007F5B496D7E6F7E82150F6F7E6F7E8215016F7E3B7FFFF80F
+FFF0B56C4813F817FCA217F86C496C13F02E3D7EBC33>107 D<383FFFFC487FB5FCA27E
+7EC7FCB3B3AD003FB612F84815FCB712FEA26C15FC6C15F8273D7ABC33>I<02FC137E3B
+7FC3FF01FF80D8FFEF01877F90B500CF7F15DF92B57E6C010F13872607FE07130301FC01
+FE7F9039F803FC01A201F013F8A401E013F0B3A53C7FFE0FFF07FF80B548018F13C0A46C
+486C01071380322C80AB33>I<4AB4FC263FFC0713C0267FFE1F13F000FF017F7F91B5FC
+6CB67E6CEC07FEC6EBF801ECF0004A7F4A7F5CA291C7FCA35BB3A43B3FFFF80FFFFC486D
+4813FEB56C4813FFA26C496C13FE6C496C13FC302C7FAB33>I<EB01FE90380FFFC0013F
+13F0497F90B57E488048EB03FF2607FC0013804848EB7FC049133F4848EB1FE049130F48
+48EB07F0A2007F15F890C71203A300FEEC01FCAA6C14036C15F8A26D1307003F15F06D13
+0FA26C6CEB1FE06D133F6C6CEB7FC06C6CEBFF802603FF0313006CEBFFFE6C5C6D5B6D5B
+010F13C0D901FEC7FC262E7AAC33>I<EC01FE3A3FFC0FFFC0486C4813F000FF017F7F91
+B512FE6CB7FC6CEBFE07C6D9F800138002E0EB7FC04AEB3FE04A131FEE0FF091C7FC1607
+4915F81603A217FC1601A9160317F8A26D140717F06E130F17E06E131FEE3FC06E137F91
+39F801FF80DAFE07130091B55A495C6E5B6E13E0020F1380DA03FEC7FC91C9FCAF383FFF
+F8487FB57EA26C5B6C5B2E427FAB33>I<ED03FE3B7FFF801FFF80B5D8C07F13E002C1B5
+FC02C314F014C76C9038CFFE0F39001FDFF09139FFC007E092388003C092C8FC5C5C5CA2
+5CA25CA35CB2007FB512FEB7FCA46C5C2C2C7DAB33>114 D<90381FFE0F90B5EA8F8000
+0314FF120F5A5AEBF007387F800190C7FC00FE147F5A153FA37E007FEC1F0001C090C7FC
+EA3FF8EBFFC06C13FF6C14E0000314F8C680011F13FF01001480020713C0EC007FED1FE0
+007C140F00FEEC07F01503A27EA27F15076D14E06D130F6DEB3FC09038FE01FF90B61280
+160000FD5C00FC14F8D8F83F13E0D8780790C7FC242E79AC33>I<EB03C0497E130FAA00
+3FB612FC4881B7FCA36C5D26000FE0C8FCB3A3161FEE3F80A5167F6E140001075C6E5A91
+38FE07FE6DB55A6D5C6D5C6E5B021F1380DA07FCC7FC29387EB633>I<D83FFCEB1FFE48
+6C497E00FF5CA2007F80003F800000EC007FB3A75EA25DA26D5B90387F800FDAE03F13FC
+6DB612FE17FF6D806D01FE13FE01039038F83FFC010001C0C7FC302C7FAA33>I<3B3FFF
+C00FFFF0486D4813F8B56C4813FCA26C496C13F86C496C13F0D801F8C7EA7E006D14FE00
+005DA26D1301017E5CA2017F13036D5CA2EC8007011F5CA2ECC00F010F5CA36D6C485AA3
+ECF03F010391C7FCA26E5A0101137EA2ECFCFE01005BA214FF6E5AA36E5AA26E5A6E5A2E
+2B7EAA33>I<3B3FFFC07FFF80486DB512C0B500F114E0A26C01E014C06C496C13803B00
+FE000FE000017F495AEB3F804B5A6D6C48C7FC90380FE07E903807F0FEECF1FC903803FB
+F8EB01FF6D5B5D6E5A143F6E5A143F814A7E14FF903801FBF0ECF9F8903803F1FCEB07E0
+157E90380FC07F011F6D7E90383F801F02007F496D7E01FE6D7E484813033B7FFFC03FFF
+E0B56C4813F0A46C496C13E02C2B7DAA33>120 D<ED07FEED7FFF4AB5FC14075C4A13FE
+91383FFE0015E0EC7F8092C7FCB3A45C495A1303EB1FFCEA3FFFB55A14E05C8014F8003F
+7FEA001FEB03FE13016D7E80B3A481EC3FE015FE91381FFFFE6E13FF8014016E7EED07FE
+284D7BC433>123 D<EA7FF0B5FC14C014F0806C7F38003FFE1303EB00FF80B3A4816E7E
+81EC1FFCEDFFFC6E13FF1403805C140F4A13FCEDFC00EC3FE05D4A5A92C7FCB3A45CEB03
+FE133F387FFFFCB55A5C14C091C8FCEA7FF0284D7BC433>125 D
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fc cmbx12 14.4 28
+/Fc 28 118 df<EA07F0487E487E487E487EB51280A76C13006C5A6C5A6C5A6C5A111176
+9025>46 D<913803FFC0023F13FC91B6FC010315C0010F018113F0903A1FFC003FF84948
+6D7E49486D7E49486D7E48496D138048496D13C0A24817E04890C813F0A34817F8A24817
+FC49157FA3007F17FEA600FF17FFB3A5007F17FEA6003F17FCA26D15FFA26C17F8A36C17
+F0A26C6D4913E0A26C6D4913C06C17806E5B6C6D4913006D6C495AD91FFCEB3FF8903A0F
+FF81FFF06D90B55A01011580D9003F01FCC7FC020313C0384F7BCD43>48
+D<157815FC14031407141F14FF130F0007B5FCB6FCA2147F13F0EAF800C7FCB3B3B3A600
+7FB712FEA52F4E76CD43>I<EC3FFE0103B512E0010F14FC013F14FF90B712C048D9C07F
+7F2703FE000F13F8D807F801037FD80FE06D7F48486D7F48488001F01680486C6E13C07F
+486C6E13E07FA27013F0A56C5AA26C5AEA0FF0EA03C0C914E05EA218C05E1880A24C1300
+5F4C5A4B5B5F4B5B5F4B5B4B90C7FC4B5A5E4B5AED7FE04B5A4A5B4A48C8FC4A5A5D4A48
+EB01F04A5AEC3F804AC7FC02FEEC03E0495A495A495A495AD91F80140749C8FC013E150F
+017FB7FC90B812C05A5A5A5A5A5A5AB9FC1880A4344E79CD43>I<91380FFFC091B512FC
+0107ECFF80011F15E090263FF8077F9026FF800113FC4848C76C7ED803F86E7E491680D8
+07FC8048B416C080486D15E0A4805CA36C17C06C5B6C90C75AD801FC1680C9FC4C13005F
+A24C5A4B5B4B5B4B13C04B5BDBFFFEC7FC91B512F816E016FCEEFF80DA000713E0030113
+F89238007FFE707E7013807013C018E07013F0A218F8A27013FCA218FEA2EA03E0EA0FF8
+487E487E487EB57EA318FCA25E18F891C7FC6C17F0495C6C4816E001F04A13C06C484A13
+80D80FF84A13006CB44A5A6CD9F0075BC690B612F06D5D011F1580010302FCC7FCD9001F
+1380374F7ACD43>I<177C17FEA2160116031607160FA2161F163F167FA216FF5D5DA25D
+5DED1FBFED3F3F153E157C15FCEC01F815F0EC03E01407EC0FC01580EC1F005C147E147C
+5C1301495A495A5C495A131F49C7FC133E5B13FC485A5B485A1207485A485A90C8FC123E
+127E5ABA12C0A5C96C48C7FCAF020FB712C0A53A4F7CCE43>I<D80380150ED807E0157E
+01FEEC03FED9FFF0137F91B65A5F5F5F5F5F94C7FC5E5E16F016C093C8FC15F801E190C9
+FC01E0CAFCABEC0FFF027F13F001E3B512FE01E76E7E9026FFF8077FDAC0017F49C713F8
+496E7E49143F4981496E7E6C481680C9FC18C08218E0A418F0A3EA0FE0487E487E487E48
+7EA418E0A35B6C484A13C05B491680003EC85A003F17006C6C4A5A6D5D6C6C4A5AD807F8
+495BD803FE01075B2701FFC03F5B6C90B65A013F4AC7FC6D14F8010314C09026007FF8C8
+FC344F79CD43>I<BA12C019FEF1FFC01AF01AFCD8000701F0C7000313FFDE007F7F737F
+070F7F737F878587858785A287A84F5BA263616361634F5B4F5B077F90C7FC4E485A0607
+13F892B812E097C8FC861AF003F0C7000313FE9539003FFF80070F13E0737F07017F8773
+7F747E1C807413C0A27413E0A31CF0A386A362A31CE0A2621CC0A250138097B5FC1C004F
+5B19074F5B073F13F04EB55ABC128098C7FC1AF81AC007F8C8FC54527CD160>66
+D<932601FFFCEC01C0047FD9FFC013030307B600F81307033F03FE131F92B8EA803F0203
+DAE003EBC07F020F01FCC7383FF0FF023F01E0EC0FF94A01800203B5FC494848C9FC4901
+F8824949824949824949824949824990CA7E494883A2484983485B1B7F485B481A3FA248
+49181FA3485B1B0FA25AA298C8FC5CA2B5FCAE6C057FB712E0A280A36C94C7003FEBC000
+A36C7FA36C7FA27E6C7FA26C7F6C7FA26D7E6D7F6D7F6D6D5E6D7F6D01FC93B5FC6D13FF
+6D6C6D5C6E01F0EC07FB020F01FEEC1FF10203903AFFF001FFE0020091B6EAC07F033FEE
+001F030703FC1307DB007F02E01301040149CAFC5B5479D26A>71
+D<B812C0A5D8000701F8C7FCB3B3B3B2B812C0A52A527CD132>73
+D<BAFC19F819FF1AE086D8000701F0C7001F13FC060113FF726C13807313C0070F13E01B
+F0857313F81BFCA27313FEA41BFFA81BFEA31BFC61A21BF84F13F04F13E0614F13C04F13
+004E485A061F5B92B812F01AC04FC7FC19E003F8CBFCB3AEB812C0A550527CD15C>80
+D<B800C00103B612FCA5D8000701F8CAEBF000F31F80B3B3B11B3FA26D97C7FC81637F1B
+7E6D6D17FE505A6E7E505A6E6D15076E4D5A6E6D4B5A6E6D4B5A6E01F84B5A6E6DDA03FF
+C8FC6E6CB46CEB0FFE6F9039F001FFF8030F90B65A030316C0DB007F92C9FC040F14F8DC
+007F13805E537CD167>85 D<B700FE031FB512FEA5D8001F01F0CA383FFE00F307F06D62
+6F170F6D62811B1F6D6D601B3F6D97C7FC6F5F6D197E821BFE6E6D5E1A016E6D5E1A036E
+60701507A26E6D5E1A0F6E6D5E1A1F6E6070153FA26E6D93C8FC626E6E147E1AFE6F5E71
+1301A26F6D5C19036F6D5C19076F5E71130FA26F6D5C191F6F6D5C193F6F93C9FC715BA2
+6FEC807E19FE706D5A18C1705C18E3705C18F318F770EBFFE0A2705CA2705CA37091CAFC
+A2705BA2715AA3715AA2715AA2715A715A5F537DD166>I<EC7FFF0107B512F0013F14FE
+90B77E48D9E00F7F2703FE000113F0486C6D7F6EEB3FFC48826E131F83707FA36C496D7F
+A26C90C7FC6C5AC9FCA6037FB5FC020FB6FC91B7FC01071487013FEBF0074913803901FF
+FC004813F0485B485B485B4890C7FC5A5BA2485AA45EA26D5C007F151D163D6C6C02797F
+6C6D01F113F86C9026C003E1EBFFE06C9026F81FC014F06C90B5487EC6ED001F011F01FC
+010713E0010101E090C8FC3C387CB641>97 D<913801FFF8021FEBFF8091B612F0010315
+FC010F9038C00FFE903A1FFE0001FFD97FFC491380D9FFF05B4817C048495B5C5A485BA2
+486F138091C7FC486F1300705A4892C8FC5BA312FFAD127F7FA27EA2EF03E06C7F17076C
+6D15C07E6E140F6CEE1F806C6DEC3F006C6D147ED97FFE5C6D6CEB03F8010F9038E01FF0
+010390B55A01001580023F49C7FC020113E033387CB63C>99 D<4DB47E0407B5FCA5EE00
+1F1707B3A4913801FFE0021F13FC91B6FC010315C7010F9038E03FE74990380007F7D97F
+FC0101B5FC49487F4849143F484980485B83485B5A91C8FC5AA3485AA412FFAC127FA36C
+7EA37EA26C7F5F6C6D5C7E6C6D5C6C6D49B5FC6D6C4914E0D93FFED90FEFEBFF80903A0F
+FFC07FCF6D90B5128F0101ECFE0FD9003F13F8020301C049C7FC41547CD24B>I<913803
+FFC0023F13FC49B6FC010715C04901817F903A3FFC007FF849486D7E49486D7E4849130F
+48496D7E48178048497F18C0488191C7FC4817E0A248815B18F0A212FFA490B8FCA318E0
+49CAFCA6127FA27F7EA218E06CEE01F06E14037E6C6DEC07E0A26C6DEC0FC06C6D141F6C
+6DEC3F806D6CECFF00D91FFEEB03FE903A0FFFC03FF8010390B55A010015C0021F49C7FC
+020113F034387CB63D>I<ED3FFC0203B5FC020F14C0023F14E09139FFF81FF0499038C0
+3FF849EB807F49903800FFFC495A495AA2495AA2EE7FF8495AEE3FF0EE0FC093C7FCAEB7
+12E0A526007FF8C8FCB3B3A7007FB512FEA52E547CD329>I<DA3FFF14FF0103B5D8F007
+13C0010FDAFC1F13E0013FECFF7F90267FFC0F9038FF9FF09026FFE001EBF83F48496C13
+E0484990387FF01F4890C7D83FF813E0489338FC0FC0F0078048486E6CC7FCA2003F82A9
+001F5EA26C6C4A5AA26C5E6C6D495A6C6D495A6C6D485BDAFC0F5B4890B6C8FCD803EF14
+FC01C314F02607C03F90C9FC91CBFCA2120FA37FA213F813FE90B7FC6C16F817FF18C06C
+836C836C836D828448B9FC12074848C700031480D81FF8EC003F4848150748486F13C083
+485A83A56D5D007F18806D5D003F18006C6C4B5AD80FFEED1FFC6C6C6CEC7FF86C01E049
+485A6C01FE011F5B6C6CB71280010F03FCC7FC010115E0D9000F01FCC8FC3C4F7CB543>
+I<137F497E000313E0487FA2487FA76C5BA26C5BC613806DC7FC90C8FCADEB3FF0B5FCA5
+12017EB3B3A6B612E0A51B547BD325>105 D<EB3FF0B5FCA51203C6FCB3A54CB512F8A5
+9339003FFE00EF1FF0EF3FC04D5A4DC7FCEE03FEEE07F84C5A4C5AEE7FC04CC8FC4B5A4B
+5AED0FF8ED1FE04B7E4B7EECF1FF02F37F02F77F91B6FC83159F030F7F02FE80DAF8077F
+4A7E6F7F6F7F83707E82707F84707F707F82707F84707F177F717E4D13C0B6D8F003B6FC
+A540537CD247>107 D<EB3FF0B5FCA512017EB3B3B3B1B612F0A51C537BD225>I<D93FF0
+EB1FFCB591B512C0030314F0030F8092391FE07FFC92393F001FFE0003027C80C602F07F
+DAF1E081ECF3C0DAF7807F8502FFC7FC5CA25CA45CB3ACB6D8F807B612C0A542367BB54B
+>110 D<913801FFE0021F13FE91B612C0010315F0010F9038807FFC903A1FFC000FFED9
+7FF86D6C7E49486D7F48496D7F48496D7F4A147F48834890C86C7EA24883A248486F7EA3
+007F1880A400FF18C0AC007F1880A3003F18006D5DA26C5FA26C5F6E147F6C5F6C6D4A5A
+6C6D495B6C6D495B6D6C495BD93FFE011F90C7FC903A0FFF807FFC6D90B55A010015C002
+3F91C8FC020113E03A387CB643>I<90397FE003FEB590380FFF80033F13E04B13F09238
+FE1FF89139E1F83FFC0003D9E3E013FEC6ECC07FECE78014EF150014EE02FEEB3FFC5CEE
+1FF8EE0FF04A90C7FCA55CB3AAB612FCA52F367CB537>114 D<903903FFF00F013FEBFE
+1F90B7FC120348EB003FD80FF81307D81FE0130148487F4980127F90C87EA24881A27FA2
+7F01F091C7FC13FCEBFFC06C13FF15F86C14FF16C06C15F06C816C816C81C681013F1580
+010F15C01300020714E0EC003F030713F015010078EC007F00F8153F161F7E160FA27E17
+E07E6D141F17C07F6DEC3F8001F8EC7F0001FEEB01FE9039FFC00FFC6DB55AD8FC1F14E0
+D8F807148048C601F8C7FC2C387CB635>I<143EA6147EA414FEA21301A313031307A213
+0F131F133F13FF5A000F90B6FCB8FCA426003FFEC8FCB3A9EE07C0AB011FEC0F8080A26D
+EC1F0015806DEBC03E6DEBF0FC6DEBFFF86D6C5B021F5B020313802A4D7ECB34>I<D93F
+F8913801FFC0B50207B5FCA50003ED001FC61607B3AE5FA35FA2017F5D173B177B6D6C14
+F3DC01E313F06D6CD907C3EBFFC0903A0FFFC03F836D90B51203010114FE6D6C13F80207
+01E091C7FC42377BB54B>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fd cmbx12 12 22
+/Fd 22 121 df<ED0FFF4AB512C0020F14F0027F80903A01FFF803FC499038C000FE010F
+EB00034948497E49485B5C495A4C138001FF6E13005CA3705AEE01F893C8FCA74BB51280
+B9FCA5C69038E00003B3B0007FD9FFC1B6FCA538467EC53E>12 D<EA07C0EA1FF0EA3FF8
+EA7FFC12FF13FEA213FFA47E7E7EEA07CFEA000FA2131F131EA2133EA2133C137C13F8A2
+EA01F0120313E0EA07C0EA1F801300121E120C1022788E1F>44 D<EA07C0EA1FF0EA3FF8
+EA7FFCEAFFFEA7EA7FFCEA3FF8EA1FF0EA07C0C7FCAEEA07C0EA1FF0EA3FF8EA7FFCEAFF
+FEA7EA7FFCEA3FF8EA1FF0EA07C00F2C78AB1F>58 D<B9FC18F018FE727E19E026003FFC
+C700077F05017F716C7E727E727EA2721380A37213C0A74E1380A24E1300A24E5A4E5A4E
+5A4D5B05075B94B5128091B700FCC7FC18F018FF19E002FCC7000113F8716C7EF01FFE72
+7E7213801AC07213E0A27213F0A31AF8A71AF0A2601AE0604E13C0604E138095B5120005
+075BBA12F86119C04EC7FC18E045447CC350>66 D<DCFFF01470031F01FF14F04AB6EAE0
+010207EDF803023FEDFE0791B539E001FF0F4949C7EA3F9F010701F0EC0FFF4901C08049
+90C87E4948814948814948167F4849163F4849161F5A4A160F485B19074890CAFC19035A
+5BA2007F1801A34994C8FC12FFAD057FB612F0127F7FA3003FDC0001EBF000A27F7EA26C
+7FA26C7F807E6C7F6C7F6D7E6D6C5D6D6C7E6D6D5C6D01F05C010101FE143F6D903AFFF0
+01FF9F023F90B6120F0207EDFC030201EDF000DA001F02C01330030001FCC9FC4C467AC4
+58>71 D<903801FFE0011F13FE017F6D7E48B612E03A03FE007FF84848EB1FFC6D6D7E48
+6C6D7EA26F7FA36F7F6C5A6C5AEA00F090C7FCA40203B5FC91B6FC1307013F13F19038FF
+FC01000313E0000F1380381FFE00485A5B127F5B12FF5BA35DA26D5B6C6C5B4B13F0D83F
+FE013EEBFFC03A1FFF80FC7F0007EBFFF86CECE01FC66CEB8007D90FFCC9FC322F7DAD36
+>97 D<EB7FC0B5FCA512037EB1ED0FF892B57E02C314E002CF14F89139DFC03FFC9139FF
+000FFE02FCEB03FF4A6D13804A15C04A6D13E05CEF7FF0A218F8173FA318FCAC18F8A217
+7F18F0A3EFFFE06E15C06E5B6E491380027C491300496C495A903AFC1FC07FFC496CB512
+F0D9F00314C049C691C7FCC8EA1FF036467DC43E>I<EC3FFC49B512C0010F14F0013F14
+FC90397FF003FE9039FFC001FF0003495A48494813805B120F485AA2485A6F1300007F6E
+5AED00784991C7FCA212FFAC6C7EA3123F6DEC03C0A26C6C1407000F16806D140F6C6DEB
+1F006C6D133E6C01F05B3A007FFC03F86DB55A010F14C0010391C7FC9038003FF82A2F7C
+AD32>I<EE03FEED07FFA5ED001F160FB1EC3FE0903803FFFC010FEBFF8F013F14CF9039
+FFF807FF48EBC00148903880007F4890C7123F4848141F49140F121F485AA3127F5BA212
+FFAC127FA37F123FA26C6C141FA26C6C143F0007157F6C6C91B5FC6CD9C00314FC6C9038
+F01FEF6DB5128F011FEBFE0F010713F89026007FC0EBF80036467CC43E>I<EC3FF80103
+B57E010F14E0013F8090397FF83FF89039FFC007FC48496C7E48496C7E48486D1380485A
+001FED7FC05B003FED3FE0A2127F5B17F0161F12FFA290B7FCA401F0C9FCA5127FA27FA2
+123F17F06C7E16016C6C15E06C6C14036C6DEB07C06C6DEB0F806C01F0EB3F0090397FFE
+01FE011FB55A010714F0010114C09026001FFEC7FC2C2F7DAD33>I<DAFFE0137E010F90
+39FE03FF80013FEBFF8F90B812C048D9C07F133F489038001FF84848EB0FFC4848903907
+FE1F80001F9238FF0F00496D90C7FCA2003F82A8001F93C7FCA26D5B000F5D6C6C495A6C
+6C495A6C9038C07FF04890B55A1680D8078F49C8FC018013E0000F90CAFCA47F7F7F90B6
+12C016FC6CEDFF8017E06C826C16FC7E000382000F82D81FF0C77ED83FC0140748480201
+13808248C9FC177FA46D15FF007F17006D5C6C6C4A5A6C6C4A5AD80FFEEC3FF83B07FFC0
+01FFF0000190B612C06C6C92C7FC010F14F8D9007F90C8FC32427DAC38>103
+D<137C48B4FC4813804813C0A24813E0A56C13C0A26C13806C1300EA007C90C7FCAAEB7F
+C0EA7FFFA512037EB3AFB6FCA518467CC520>105 D<EB7FC0B5FCA512037EB3B3B3A3B6
+1280A519457CC420>108 D<90277F8007FEEC0FFCB590263FFFC090387FFF8092B5D8F0
+01B512E002816E4880913D87F01FFC0FE03FF8913D8FC00FFE1F801FFC0003D99F009026
+FF3E007F6C019E6D013C130F02BC5D02F86D496D7EA24A5D4A5DA34A5DB3A7B60081B600
+03B512FEA5572D7CAC5E>I<90397F8007FEB590383FFF8092B512E0028114F8913987F0
+3FFC91388F801F000390399F000FFE6C139E14BC02F86D7E5CA25CA35CB3A7B60083B512
+FEA5372D7CAC3E>I<EC1FFC49B512C0010714F0011F14FC90397FF80FFF9026FFC0017F
+48496C7F4848C7EA3FE000078248486E7E49140F001F82A2003F82491407007F82A400FF
+1780AA007F1700A46C6C4A5AA2001F5E6D141F000F5E6C6C4A5AA26C6C6CEBFFE06C6D48
+5B27007FF80F90C7FC6DB55A010F14F8010114C09026001FFCC8FC312F7DAD38>I<9039
+7FC00FF8B590B57E02C314E002CF14F89139DFC03FFC9139FF001FFE000301FCEB07FF6C
+496D13804A15C04A6D13E05C7013F0A2EF7FF8A4EF3FFCACEF7FF8A318F017FFA24C13E0
+6E15C06E5B6E4913806E4913006E495A9139DFC07FFC02CFB512F002C314C002C091C7FC
+ED1FF092C9FCADB67EA536407DAC3E>I<90387F807FB53881FFE0028313F0028F13F8ED
+8FFC91389F1FFE000313BE6C13BC14F8A214F0ED0FFC9138E007F8ED01E092C7FCA35CB3
+A5B612E0A5272D7DAC2E>114 D<90391FFC038090B51287000314FF120F381FF003383F
+C00049133F48C7121F127E00FE140FA215077EA27F01E090C7FC13FE387FFFF014FF6C14
+C015F06C14FC6C800003806C15806C7E010F14C0EB003F020313E0140000F0143FA26C14
+1F150FA27EA26C15C06C141FA26DEB3F8001E0EB7F009038F803FE90B55A00FC5CD8F03F
+13E026E007FEC7FC232F7CAD2C>I<EB01E0A51303A41307A2130FA2131FA2133F137F13
+FF1203000F90B51280B7FCA4C601E0C7FCB3A3ED01E0A9150302F013C0137F150790393F
+F80F8090391FFC1F006DB5FC6D13FC01015B9038003FE023407EBE2C>I<D97FC049B4FC
+B50103B5FCA50003EC000F6C81B3A85EA25EA25E7E6E491380017FD901F713FE9138F807
+E76DB512C7010F1407010313FE9026007FF0EBFC00372E7CAC3E>I<B500FE90383FFFF0
+A5C601F0903803E0006D6C495A013F4A5A6D6C49C7FC6E5B6D6C137E6DEB807C6D6D5A6D
+EBC1F0EDE3E06DEBF7C06EB45A806E90C8FC5D6E7E6E7F6E7FA24A7F4A7F8291381F3FFC
+EC3E1F027C7F4A6C7E49486C7F01036D7F49487E02C08049486C7F49C76C7E013E6E7E01
+7E141FB500E090B512FCA5362C7EAB3B>120 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 D<B612C0A61A067F9721>I<121EEA7F80A2EAFFC0A4EA7F80A2EA1E00
+0A0A78891B>I<1618163C167CA2167816F8A216F01501A216E01503A216C01507A21680
+150FA2ED1F00A2151E153EA2153C157CA2157815F8A25D1401A24A5AA25D1407A25D140F
+A292C7FC5CA2141E143EA2143C147CA25CA25C1301A25C1303A25C1307A25C130FA291C8
+FC5BA2133EA2133C137CA2137813F8A25B1201A25B1203A2485AA25B120FA290C9FC5AA2
+121E123EA2123C127CA2127812F8A25A126026647BCA31>I<14FF010713E090381F81F8
+90383E007C01FC133F4848EB1F8049130F4848EB07C04848EB03E0A2000F15F049130100
+1F15F8A2003F15FCA390C8FC4815FEA54815FFB3A46C15FEA56D1301003F15FCA3001F15
+F8A26C6CEB03F0A36C6CEB07E0000315C06D130F6C6CEB1F806C6CEB3F00013E137C9038
+1F81F8903807FFE0010090C7FC28447CC131>I<143014F013011303131F13FFB5FC13E7
+13071200B3B3B0497E497E007FB6FCA3204278C131>I<EB03FE90381FFFC0017F13F039
+01F80FFC3903C001FE48486C7E000EC7EA7F8048EC3FC0ED1FE04815F00030140F007015
+F800601407126CB415FC7F7F1503A46C4813076CC7FCC8FC16F8A2150F16F0151F16E0A2
+ED3FC0ED7F8016005D5D4A5A4A5A4A5A5D4A5A4A5A4AC7FC147C5C5C495A495A495A49C7
+120C131E5B013814185B5B485A4848143848C81230000E1570001FB612F0A25A5AB712E0
+A326427BC131>I<49B4FC010F13E0013F13FC9038FE01FE3A01F0007F80D803C0EB3FC0
+48C7EA1FE0120EED0FF0EA0FE0486C14F8A215077F5BA26C48130FEA03C0C813F0A3ED1F
+E0A2ED3FC01680ED7F0015FE4A5AEC03F0EC1FC0D90FFFC7FC15F090380001FCEC007FED
+3F80ED1FC0ED0FE016F0ED07F816FC150316FEA2150116FFA3121EEA7F80487EA416FE49
+1303A2007EC713FC00701407003015F80038140F6C15F06CEC1FE06C6CEB3FC0D803E0EB
+7F803A01FE01FE0039007FFFF8010F13E0010190C7FC28447CC131>I<ED0380A2150715
+0FA2151F153FA2157F15FFA25CEC03BF153F14071406140C141C141814301470146014C0
+13011480EB03005B13065B131C13185B1370136013E0485A5B120390C7FC1206120E120C
+5A123812305A12E0B812C0A3C8383F8000ADEDFFE0027FEBFFC0A32A437DC231>I<0006
+15C0D807C0130701FCEB7F8090B612005D5D5D15E0158026063FFCC7FC90C9FCAE14FF01
+0713C090381F01F090383800FC01F0137ED807C07F49EB1F8016C090C7120F000615E0C8
+EA07F0A316F81503A216FCA5123E127F487EA416F890C712075A006015F0A20070140F00
+3015E00038EC1FC07E001EEC3F806CEC7F006C6C13FE6C6C485A3901F807F039007FFFE0
+011F90C7FCEB07F826447BC131>I<EC07FCEC3FFF91B512C0903903FC03E0903907E000
+F0D91FC0133849C71258017EEB01FC01FE1303491307485A485AA24848EB03F8000FEC01
+F092C7FC485AA3485AA3127FA29038007F80903801FFF090380780FC39FF0E003E49EB1F
+8049EB0FC049EB07E0136001E0EB03F04914F8150116FC5BED00FEA390C812FFA47EA57F
+123FA216FE121F15016D14FC120FED03F86C7EED07F06C6C14E06C6CEB0FC06C6CEB1F80
+017EEB3F0090383F80FE90380FFFF8010313E00100138028447CC131>I<14FF010713E0
+011F13F890387F00FE01FC133FD801F0EB1F804848EB0FC049EB07E00007EC03F0484813
+01A290C713F8481400A47FA26D130116F07F6C6CEB03E013FC6C6CEB07C09039FF800F80
+6C9038C01F006CEBF03EECF87839007FFEF090383FFFC07F01077F6D13F8497F90381E7F
+FFD97C1F1380496C13C02601E00313E048486C13F000079038007FF84848EB3FFC48C712
+0F003EEC07FE150148140016FF167F48153FA2161FA56C151E007C153EA2007E153C003E
+157C6C15F86DEB01F06C6CEB03E06C6CEB07C0D803F8EB1F80C6B4EBFF0090383FFFFC01
+0F13F00101138028447CC131>56 D<121EEA7F80A2EAFFC0A4EA7F80A2EA1E00C7FCB3A5
+121EEA7F80A2EAFFC0A4EA7F80A2EA1E000A2B78AA1B>58 D<007FBAFCBB1280A26C1900
+CEFCB0007FBAFCBB1280A26C190041187BA44C>61 D<16C04B7EA34B7EA34B7EA34B7EA3
+ED19FEA3ED30FFA203707FED607FA203E07FEDC03FA2020180ED801FA2DA03007F160FA2
+0206801607A24A6D7EA34A6D7EA34A6D7EA20270810260147FA202E08191B7FCA2498202
+80C7121FA249C87F170FA20106821707A2496F7EA3496F7EA3496F7EA201788313F8486C
+83D80FFF03037FB500E0027FEBFFC0A342477DC649>65 D<B8FC17E017FC00019039C000
+03FF6C6C4801007FEF3FC0717E717E717E84170384170184A760A21703601707604D5A4D
+5AEF7FC04DC7FCEE03FEEE3FF091B65A17FC0280C7B47EEF1FC0EF0FF0717E717E717E71
+7E1980187F19C0A2183F19E0A8F07FC0A2198018FF4D1300A24D5AEF0FFC4D5AEF7FE048
+486C903803FFC0B9C7FC17FC17C03B447CC345>I<DB0FFE146092B500C013E0020314F0
+913A0FFC01FC0191393FC0003E02FFC7EA0F83D903FCEC03C74948EC01E74948EC00FF49
+48157F4948153F4948151F49C9120F485A491607120348481603A248481601A248481600
+A2123FA2491760127FA31900485AAE6C7EA21960A2123F7FA2001F18E07F000F18C0A26C
+6C160119806C6C160312016DEE07006C6C16066D6C150E6D6C5D6D6C5D6D6C15786D6C5D
+6D6C4A5AD900FFEC0780DA3FC0011FC7FCDA0FFC13FC0203B512F0020014C0DB0FFEC8FC
+3B487BC546>I<B8FC17F017FC00019039C00007FF6C499038007FC0017FED1FE0EF07F0
+EF03FC717E717E84727E727E727EA2727E85180385A2180185A38584A31A80AD1A00A360
+61A361180361180761180F614E5A183F614EC7FC18FEEF03FC4D5AEF1FE001FFED7FC048
+6DD907FFC8FCB812FC17F094C9FC41447CC34B>I<B912F8A3000101C0C7127F6C6C48EC
+07FC17011700187C183C181CA284A31806A4180704067FA395C7FCA4160EA2161E163E16
+FE91B5FCA3EC8000163E161E160EA21606A319C0A3F0018093C7FCA41803A21900A260A2
+60A2181EA2183E187EEF01FE170748486C147FB95AA33A447CC342>I<B912F0A3000101
+C0C7127F6C6C48EC0FF817031701170018781838A2181CA3180CA4180E1806160CA21800
+A5161CA2163C167CED01FC91B5FCA3EC8001ED007C163C161CA2160CA793C8FCB0804848
+7EB612F8A337447CC340>I<DB0FFE146092B500C013E0020314F0913A0FFC01FC019139
+3FC0003E02FFC7EA0F83D903FCEC03C74948EC01E74948EC00FF4948157F4948153F4948
+151F49C9120F485A491607120348481603A248481601A248481600A2123FA2491760127F
+A396C7FC485AAD4CB612C06C7EA293C7387FF000725A003F171F7FA2121F7F120FA26C7E
+A26C7E6C7EA26C7E6D7E6D6C153F6D7E6D6C157F6D6C15E7D903FEEC01C7D900FFEC0383
+DA3FE0EB0F01DA0FFCEBFE000203B500F81360020002E090C7FCDB0FFEC9FC42487BC54D
+>I<B6D8C003B6FCA3000101E0C70007138026007F80913801FE00B3A991B7FCA30280C7
+1201B3AC2601FFE0913807FF80B6D8C003B6FCA340447CC349>I<B612F0A3C6EBF0006D
+5A6D5AB3B3B3A4497E497EB612F0A31C447DC323>I<B600C049B512C0A3000101E0C838
+7FFC006C49ED3FE06D481680063EC7FC183C183860604D5A4D5A4DC8FC171E17385F5F4C
+5A4C5A4CC9FC160E5E5E5E5E4B5A4B7E4B7E150F4B7E4B7E1577EDE3FE913881C1FFEC83
+81DA87007F028E6D7E149C02B86D7E02F06D7E14C04A6D7E707EA2707E707EA2707F717E
+A2717E717EA2717E717EA2717E717EA2717F8585496C82486D4A13FCB600C0011FEBFFE0
+A343447CC34C>75 D<B612F8A3000101E0C9FC6C6C5A5CB3B31830A418701860A518E0A3
+EF01C0A217031707A2170F173F177FEE01FF48486C011F1380B9FCA334447CC33D>I<B5
+6C933807FFFC6E5EA20001F1FE0026006FE0EE1BF8A3D967F01633A2D963F81663A3D961
+FC16C3A3D960FEED0183A2027FED0303A36E6C1406A36E6C140CA26E6C1418A36E6C1430
+A36E6C1460A26E6C14C0A36E6CEB0180A3037FEB0300A292383F8006A36F6C5AA36F6C5A
+A26F6C5AA36F6C5AA36F6C5AA26FB45AA370C7FC13F0A2486C143ED80FFFEF0FFEB500F0
+011C0107B512FCA34E447BC359>I<B56C020FB5FC8080C6040013F06D6CED1F80D96FF8
+ED0F00A2D967FC1506EB63FEA2EB61FF01607FA26E7E6E7EA26E7E6E7EA26E7E6E7EA26E
+7E6E7FA26F7E6F7EA26F7E6F7EA26F7E6F7EA26F7E6F1380A2EE7FC0EE3FE0A2EE1FF0EE
+0FF8A2EE07FCEE03FEA2EE01FF701386A2EF7FC6EF3FE6A2EF1FF6EF0FFEA217071703A2
+17011700A201F0167E183E487ED80FFF161EB500F0150EA2180640447CC349>I<ED1FFC
+4AB512C0913907F007F091391F8000FC027EC7123FD901F8EC0FC049486E7E49486E7E49
+486E7E49486E7E49C9127E017E8201FE834848707E4848707EA24848707EA2000F844916
+03001F84A24848707EA3007F84A24982A300FF1980AD6C6C4C1300A4003F606D1603A200
+1F60A26C6C4C5AA26C6C4C5AA20003606D161F6C6C4C5A000060017F4CC7FC6E5D013F5E
+6D6C4A5AD907E0EC03F06D6C4A5AD901FCEC1FC0D9007E4AC8FCDA1F8013FC913907F007
+F00201B512C09126001FFCC9FC41487BC54C>I<B712FCEEFFC017F800019039C0000FFC
+6C6C48EB01FF9338007F80EF1FE0170FEF07F018F8EF03FCA218FE1701A218FFA718FEA2
+170318FCA2EF07F818F0EF0FE0EF1FC0EF7F80933801FE00EE0FFC91B612F017800280C9
+FCB3AA3801FFE0B612C0A338447CC342>I<ED1FFC4AB512C0913907F007F091391F8000
+FC027EC7123F4948EC1FC0D903F0EC07E049486E7E49486E7E49486E7E49C9127E49167F
+01FE707E4848707E00038449160F000784491607000F84A24848707EA2003F84491601A2
+007F84A34982A200FF1980AD007F19006D5EA3003F60A26D1603001F60A2000F606D1607
+0007606DD903F0130F0003DA0FFC5C6DD91C0E131F00014A6C5C6C6C903A3003803F8001
+7FD9700149C7FC92386000C0D93F8015FED91FC0ECE1FCD907E0EC63F0D903F0EC77E090
+2601FC70EB7FC09026007E3091C8FCDA1FB813FC912707FC07F814C00201B57E9139001F
+FC3C92C7FC053E1301171E051F13031A80F08007F0C00F94380FF03F95B51200A2836171
+5BA2715B9438007FE0F01F8042597BC54C>I<B712E016FF17C000019039C0003FF86C6C
+48EB03FCEE00FF717E717E717E717E717EA284170384A760A21707604D5AA24D5A4D5A4D
+C8FCEE01FEEE07F8EE3FE091B6C9FC16FC913980007F80EE0FE0707EEE03FC707E160083
+717EA2717EA784A71A6084171FA21AE0716C13C02601FFE002071301B600C01680943801
+FC03943900FE0700CBEA3FFEF007F843467CC348>I<49B41303010FEBE007013F13F890
+39FE00FE0FD801F8131FD807E0EB079F49EB03DF48486DB4FC48C8FC4881003E81127E82
+127C00FC81A282A37E82A27EA26C6C91C7FC7F7FEA3FF813FE381FFFE06C13FE6CEBFFE0
+6C14FC6C14FF6C15C0013F14F0010F80010180D9001F7F14019138001FFF03031380816F
+13C0167F163F161F17E000C0150FA31607A37EA36C16C0160F7E17806C151F6C16006C5D
+6D147ED8FBC05CD8F9F0495AD8F07C495A90393FC00FE0D8E00FB51280010149C7FC39C0
+003FF02B487BC536>I<003FB912F8A3903BF0001FF8001F01806D481303003EC7150048
+187C0078183CA20070181CA30060180CA5481806A5C81600B3B3A54B7EED7FFE49B77EA3
+3F447DC346>I<B600C0010FB5FCA3000101E0C813F026007F80ED1F80F00F00A21806B3
+B3A7180E6D6C150CA2181C131F6E1518010F163818306D6C1570606D6C14016D6C5D6D6C
+EC0780027F4AC7FC6E6C131EDA1FE0137C913907FC03F00201B55A6E6C1380DB07FCC8FC
+40467CC349>I<B60107B500F890380FFFFEA3000301E0D9001F90C813F06C0180DA0FFC
+ED3FC091C86C48ED1F006C871C0E6D6C6E7E1C0CA26D6C6F5DA36EDA06FF1538011F1A30
+A26E020E6D1470010FDB0C7F1560A26E021C7F0107DB183F5DA2856D6CDA301F4A5AA36D
+6C4A6C6C49C7FCA36D6C4A6C6C1306A3DB80016E130E027FDA8003140CA2DBC00380023F
+DA00015CA203E081021F01066D5CA36E6C486E6C5AA36E6C486E6C5AA36F48EC1FE10203
+60A2DBFE7015F302010160020F90C8FCA2DBFFE015FB6E49EC07FEA36F486E5AA36FC86C
+5AA3031E6F5AA4030C16605F467EC364>87 D<003FB500E0011FB5FCA3C691C7000713E0
+D93FFC020190C7FC6D4815FC010F6F5A6D6C15E0A26D6C4A5A6D6C5D4DC8FC6D6D5B6E6C
+13065F6E6C131C6E6C13185F6E6C13706E6C13605F913803FE01DA01FF5B4CC9FC6E1387
+ED7FC616CCED3FFC6F5A5E6F7E6F7EA26F7E82A203067F150E92380C7FC04B6C7E153892
+38301FF04B6C7E15E04B6C7E4A486C7E14034B6C7E02066D7F140E020C6E7E4A6E7E1438
+02306E7E4A6E7E14E04A6E7E49486E7E130349C86C7E496F7F5B496C8201FF83000701E0
+020313F8B500F8021FEBFFF0A344447EC349>I<B66C91380FFFFCA3000101F8C8000313
+C026007FE0923800FE0061013F17F06D6C5E80010F5F6D6C4B5A18036D6C93C7FC6E1506
+6D160E6D6D140C181C6E6C14186E6C5C18706E6C146018E06E6C5C6E6C495A17036E6C91
+C8FC5F6E6C13066E6D5A171C92387FC0185FED3FE06F6C5A17E06F6C5AEEF980ED07FF6F
+90C9FCA26F5AB3A6923807FF800203B6FCA346447FC349>I<EAFFFCA4EAF000B3B3B3B3
+B3A2EAFFFCA40E6476CA1B>91 D<01C01318000114384848137048C712E0000EEB01C000
+0C1480001C13030018140000385B003013060070130E0060130CA300E0131C481318A400
+CFEB19E039FFC01FF801E013FCA3007F130FA2003F130701C013F8390F0001E01E1D71C4
+31>I<EAFFFCA4EA003CB3B3B3B3B3A2EAFFFCA40E647ECA1B>I<13C01201EA0380EA0700
+120E120C121C12181238123012701260A312E05AA412CFEAFFC013E0A3127FA2123F13C0
+EA0F000B1D79C41B>96 D<EB07FC90383FFF809038F80FE03903C003F048C66C7E000E6D
+7ED80FC0137E486C137F6D6D7EA36F7EA26C5AEA0380C8FCA4EC0FFF49B5FC90380FFE1F
+EB3FC0EBFF00EA03FC485A485A485A485A127F5B176048C7FCA3153FA36D137F007F14EF
+6D9038C7E0C0003F13013A1FE00783F13B07F81E03FF802701FFFC0113003A001FE0007C
+2B2E7CAC31>I<EA01FC12FFA3120712031201B3EC03FC91380FFF8091383C07E0913870
+01F89039FDE0007E02807F01FFEC1F8091C713C049EC0FE049140717F0A2EE03F8A217FC
+A2160117FEAB17FC1603A217F8A2EE07F0A26DEC0FE017C06D141F01FBEC3F80D9F380EB
+7E00D9E1C05B9039E0F001F89039C03C07E09039801FFF80C7D803FCC7FC2F467DC436>
+I<EC7F80903803FFF090380FC07C90383F000F01FCEB03804848EB01C00003140F4848EB
+1FE049133F120F485AA2485AED1FC0007FEC070092C7FCA290C9FC5AAB7E7FA2123F1630
+7F001F15706C6C146016E06C6C14C06C6C13010001EC03806C6CEB0700013F131E90381F
+C078903807FFF001001380242E7DAC2B>I<167FED3FFFA315018182B3EC7F80903803FF
+F090380FC07C90383F000E017E1307496D5AD803F87F48487F5B000F81485AA2485AA212
+7FA290C8FC5AAB7E7FA2123FA26C7EA2000F5D7F6C6C5B00035C6C6C9038077F806C6C01
+0E13C0013F011C13FE90380FC0F8903803FFE09026007F0013002F467DC436>I<EB01FE
+903807FFC090381F03F090387E00FC49137E48487F485A4848EB1F80000F15C049130F12
+1F484814E01507A2007F15F090C7FCA25AA390B6FCA290C9FCA67EA27FA2123F16306C7E
+1670000F15606D14E06C6C14C0000314016C6CEB03806C6CEB0700013E131E90381F80F8
+903803FFE0010090C7FC242E7DAC2B>I<EC0FE0EC7FF8903801F81E903803F03F90390F
+E07F8090381FC0FF5C133F495AA2ED7F0001FE131C92C7FCAFB67EA3C648C8FCB3B2486C
+7E007F13FFA321467EC51E>I<EE0F80D901FCEB7FE0903A0FFF81F0F090393F07E38190
+39FC01FF033A01F800FE014848017E13E00007027FC7FC497F000F8149131F001F81A900
+0F5D6D133F000792C7FC6D5B0003147E6C6C5B6D485A3903BF07E090380FFF80260701FC
+C8FC90CAFCA25AA37F6C7E7F90B512F86C14FF16E06C15F86C6C8048B67E3A07C0000FFF
+48481300003FC8EA3F80003E151F48ED0FC0A2481507A56C150F007C1680007E151F003E
+16006C153E6C6C5CD807E0495AD801F8EB07E0D8007FEB3F8090261FFFFEC7FC010113E0
+2C427DAC31>I<EA01FC12FFA3120712031201B3EC01FE913807FFC091381E07F0913838
+01F802707FECE000D9FDC07F5C01FF147F91C7FCA25BA35BB3A8486CECFF80B5D8F83F13
+FEA32F457DC436>I<EA01E0EA07F8A2487EA46C5AA2EA01E0C8FCADEA01FC12FFA31207
+12031201B3B0487EB512F8A315437DC21C>I<143C14FFA2491380A46D1300A2143C91C7
+FCADEC7F80EB3FFFA31300147F143FB3B3AA123E127F39FF807F00A2147EA25C6C485A38
+3C01F06C485A3807FF80D801FEC7FC195785C21E>I<EA01FC12FFA3120712031201B3A2
+92381FFFE0A36F1300ED07F816E05E5E030EC7FC5D5D5D5D4A5A4A5A4AC8FC5CEC3F804A
+7E14FF9038FDCFE09038FF8FF01407496C7E01FC7F14016E7E81816F7E82151F6F7E8215
+07826F7E8282486C491380B5D8F81F13F8A32D457DC433>I<EA01FC12FFA31207120312
+01B3B3B3A5487EB512F8A315457DC41C>I<D801FC01FFEC1FE000FF010701E0EBFFFC91
+3B0F03F801E07F913C3C01FC07803F800007903C7000FE0E001FC0000349D97E1C130F26
+01FDC0D97F38804A143001FFDA3FF06D7E91C75BA2495DA3495DB3A8486C4A6C497EB5D8
+F81FB50003B512E0A34B2C7DAB52>I<3901FC01FE00FF903807FFC091381E07F0913838
+01F8000701707F0003EBE0002601FDC07F5C01FF147F91C7FCA25BA35BB3A8486CECFF80
+B5D8F83F13FEA32F2C7DAB36>I<EC7F80903803FFF090380FC0FC90383E001F496D7E49
+6D7E48486D7E48486D7E48486D7E000F81A24848147E003F157FA290C87E481680A44816
+C0AA6C1680A26D147F003F1600A2001F157E6D14FE000F5D6D130100075D6C6C495A6C6C
+495A6C6C495A013E49C7FC90381FC0FE903807FFF89038007F802A2E7DAC31>I<3901FC
+03FC00FF90380FFF8091383C07E091387001F83A07FDE000FE00010180137F01FFEC3F80
+91C7EA1FC04915E049140F17F0160717F8160317FCA3EE01FEABEE03FCA3EE07F8A217F0
+160F6D15E0EE1FC06D143F17806EEB7E00D9FDC05B9039FCF003F891383C0FE091381FFF
+80DA03FCC7FC91C9FCAE487EB512F8A32F3F7DAB36>I<3903F803F000FFEB1FFCEC3C3E
+EC707F0007EBE0FF3803F9C000015B13FBEC007E153C01FF13005BA45BB3A748B4FCB512
+FEA3202C7DAB26>114 D<90383FE0183901FFFC383907E01F78390F0003F8001E130148
+1300007C1478127800F81438A21518A27EA27E6C6C13006C7E13FC383FFFE06C13FC6C13
+FF6C14C06C14E0C614F0011F13F81300EC0FFC140300C0EB01FE1400157E7E153EA27EA3
+6C143C6C147C15786C14F86CEB01F039F38003E039F1F00F8039E07FFE0038C00FF01F2E
+7DAC26>I<1306A5130EA4131EA3133E137EA213FE12011207001FB512F0B6FCA2C648C7
+FCB3A4150CAA017E131C017F1318A26D133890381F8030ECC070903807E0E0903801FFC0
+9038007F001E3E7EBC26>I<D801FC147F00FFEC3FFFA300071401000380000181B3A85E
+A35DA212006D5B017E9038077F80017F010E13C06D011C13FE90380FC078903803FFF090
+26007F8013002F2D7DAB36>I<B539F001FFFCA3000790C7EA7FE06C48EC1F8000011600
+160E1200160C017F5CA280013F5CA26E1370011F146080010F5CA2ECF00101075CA26D6C
+48C7FCA26E5A01011306A26D6C5AA214FF6E5AA215B8EC3FB015F06E5AA36E5AA26E5AA3
+6EC8FC2E2C7EAA33>I<B500E0B539E03FFF80A30007903C000FFE000FFC00D803FCD903
+F8EB03F8F001E0120103015D6D80000060A26D6E13036DD9037E91C7FCA20280017F5B01
+3FD9063F1306A2D91FC06E5AED0C1FA2D90FE06E5AED180FA2D907F06E5AED3007A2D903
+F86E5AED6003A2902601FCE06D5AEDC00117FCD900FFECFD80ED800017FF027F92C8FC92
+C77EA26E147E023E143EA2021E143C021C141CA2412C7EAA46>I<B539F007FFFCA30003
+D9C00113C0C6496C1300017F14FC013F5C6E13E06D7E010F495A6D6C485A02F890C7FC90
+3803FC060101130E6E5A903800FF186E5AEC3FF05D141F140F6E7E81140FEC0DFCEC19FE
+EC38FF4A7E9138603F8002C07F0101131F49486C7E02007F01066D7E010E1303496D7E01
+3C80017C80D801FC1580D80FFE4913C0B5D8800F13FFA3302B7FAA33>I<B539F001FFFC
+A3000790C7EA7FE06C48EC1F8000011600160E0000150C6D141C6D1418A26E1338013F14
+30A26D6C5BA26E13E0010F5CA26D6C485AA2ECF803010391C7FCA2903801FC06A2ECFE0E
+0100130CA2EC7F18A215B8EC3FB0A2EC1FE0A36E5AA26E5AA36EC8FCA21406A35CA25CA2
+123C007E5BB4FC5CA25CEAFE01387C0380D87007C9FCEA3C1EEA0FFCEA03F02E3F7EAA33
+>I<003FB612E0A29038C0003F90C713C0003CEC7F800038ECFF00A20030495A0070495A
+A24A5A0060495AA24A5A4A5AA2C7485A4AC7FC5B5C495A13075C495A131F4A1360495A49
+5AA249C712C0485AA2485A485A1501485A48481303A24848EB07804848131F00FF14FF90
+B6FCA2232B7DAA2B>I<B9FCA23002809B31>I 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>I<F01F804E
+7E187F18FFA25F5F5F5FA25F5F5FA294B5FC5E5E5EA25E5EEE3FBFEE7F3FA216FEED01FC
+ED03F8ED07F0A2ED0FE0ED1FC0ED3F8016005D15FE4A5A4A5AA24A5A4A5A4A5A4A5AA24A
+C7FC14FE495A5C1303495A495A495A5C133F49C8FC13FE485AA2485A485A485A5B121F48
+5A48C9FC12FEBCFCA6CA6CEBC000B1037FB8FCA6485E7CDD51>I<01C0EE01C0D801F816
+0F01FF167F02F0EC07FFDAFF8090B5FC92B7128019006060606060606095C7FC17FC5F17
+E0178004FCC8FC16E09026FC3FFCC9FC91CBFCADED3FFE0203B512F0020F14FE023F6E7E
+91B712E001FDD9E00F7F9027FFFE00037F02F801007F02E06EB4FC02806E138091C8FC49
+6F13C04917E07113F0EA00F090C914F8A219FC83A219FEA419FFA3EA03F0EA0FFC487E48
+7E487FA2B57EA319FEA35C4D13FC6C90C8FC5B4917F8EA3FF001804B13F06D17E0001F5E
+6C6C17C06D4B1380D807FC92B512006C6C4A5B6C6C6C01075B6C01E0011F5BD97FFE90B5
+5A6DB712C0010F93C7FC6D15FC010115F0D9003F1480020301F0C8FC406078DD51>I<EE
+1FFF0303B512E0031F14F892B612FE0203814AD9FC037F021F9039C0007FC04A90C7EA1F
+E0DAFFFC6E7E494914074949EC7FF8494914FF49495B4949497F4990C7FC495D5C13FF48
+5BA25A4A6E5B5A715B48496E5B725A4894C8FCA35AA35C48913801FFE0030F13FE033F6D
+7E4B14E092B612F89126E1FE037FB53AE3F0007FFEDAE7E06D7EDAEFC06D7F4B6D7F02FF
+C76C7F4A82717F4A82A24A828385A24A1780A54A17C0A37EA77EA47E6E1780A27EA21A00
+7E4D5B7E6E5E7E6E5E6C4C5B6D7E013F4B5B6D6C4A5B6D01C0495B6D6D90B5C7FC6DD9FC
+0713FC6D90B65A6D5E023F15C0020F92C8FC020114F8DA001F1380426079DD51>I<4DB5
+ED03C0057F02F014070407B600FE140F047FDBFFC0131F4BB800F0133F030F05FC137F03
+3F9127F8007FFE13FF92B6C73807FF814A02F0020113C3020702C09138007FE74A91C900
+1FB5FC023F01FC16074A01F08291B54882490280824991CB7E4949844949844949844986
+5D49498490B5FC484A84A2484A84A24891CD127FA25A4A1A3F5AA348491A1FA44899C7FC
+A25CA3B5FCB07EA380A27EA2F50FC0A26C7FA37E6E1A1F6C1D80A26C801D3F6C6E1A00A2
+6C6E616D1BFE6D7F6F4E5A7F6D6D4E5A6D6D4E5A6D6D4E5A6D6E171F6D02E04D5A6E6DEF
+FF806E01FC4C90C7FC020F01FFEE07FE6E02C0ED1FF8020102F8ED7FF06E02FF913803FF
+E0033F02F8013F1380030F91B648C8FC030117F86F6C16E004071680DC007F02F8C9FC05
+0191CAFC626677E375>67 D<BD12FCA488A2D8000102C0C71201F1000F1A01F2007F1B3F
+1B0F1B07757EA28787A288A3F43F80A31C1FA3197EA3F40FC0A499C7FC19FEA31801A218
+031807181F18FF93B6FCA6EEC000181F180718031801A21800A21D7E197EA21DFCA696C8
+12011DF8A31C03A3F407F0A31C0FA21C1F1C3F1DE01C7F1CFF63631B0F093F13C098B5FC
+1A0797B6FCBEFCA31D80A35F617AE06A>69 D<BD12E0A41CF0A2D8000102C0C71207F100
+3F1A0F1A031A001B7F1B3FF31FF81B0FA21B07A21B03A21B011CFCA31B00A419FCA21C7E
+A41C00A21801A31803A21807180F183FEF01FF93B6FCA6EEC001EF003F180F18071803A2
+1801A31800A896C9FCB3A5B912F8A657617AE065>I<B912E0A6C702E0C7FCB3B3B3B3AE
+B912E0A633627CE13C>73 D<BA12F8F1FFE01AFEF2FFC01BF01BFED800010280C76C7F07
+0714C0070014F0747F081F7F747F747F7480A2748089A37480A389A865A3505CA265A250
+5C9AC9FC505B505B505B087F5B4FB55A0707148096B548CAFC93B812F81BC050CBFC621A
+FF932680000314C0DE007F7F071F13F8737F737F737F73808885888688A2747FA688A688
+A676140FF71F80A374801F3F86771400745E746E5BB96E6E5B746E485A75EBFE07091F90
+B55A090715E009015DCF003F91C7FC0A0013FC71647AE178>82 D<DBFFFCEC01E0020FD9
+FFE01303027F02FC130749B7130F0107EEC01F011F16F049D9C007EBF83F4948C7383FFE
+7FD9FFF8020FB5FC4801E014014849804849153F91C97E484882001F834982003F83845B
+007F187FA2193FA200FF181FA27F190FA27FA26D17078080806C01F893C7FC80ECFF8015
+F86CECFFC016FC6CEDFFE017FE6CEEFFE018F86C17FE6C717E6C846C846D17F86D836D83
+6D8313036D18806D6C17C0020F17E01401DA000F16F01500040715F8EE007F1703050014
+FC183F84060713FE84A2007C8300FC83A2197FA3193F7EA31AFC7EA27F1AF86D177F7F1A
+F06D17FF6D18E06D5E01FF18C06E4B138002E04B130002F84B5A02FFED3FFC01CF01E0EC
+FFF8018301FF010F5B010191B65A6D6C5E48011F93C7FC48010315FC48D9003F14E04802
+0149C8FC476677E35A>I<B96C023FB612FEA6D8000102C0CA0007EBF000E2007FC7FCB3
+B3B3AA656D63A2821C01806570170380525A6E7F6E4F5A70171F6E626E6D4D5A6E6D177F
+525A6E6E030390C8FC033F01E04B5A6F6DED1FFC6F01FCED7FF80303D9FF80903803FFE0
+6F02F8017F5B6F6C90B7C9FC041F5E040716F8040016C0050F4ACAFCDD003F13C06F647A
+E17C>85 D<913803FFFE027FEBFFF00103B612FE010F6F7E4916E090273FFE001F7FD97F
+E001077FD9FFF801017F486D6D7F717E486D6E7F85717FA2717FA36C496E7FA26C5B6D5A
+EB1FC090C9FCA74BB6FC157F0207B7FC147F49B61207010F14C0013FEBFE004913F048B5
+12C04891C7FC485B4813F85A5C485B5A5CA2B55AA45FA25F806C5E806C047D7F6EEB01F9
+6C6DD903F1EBFF806C01FED90FE114FF6C9027FFC07FC01580000191B5487E6C6C4B7E01
+1F02FC130F010302F001011400D9001F90CBFC49437CC14E>97 D<92380FFFF04AB67E02
+0F15F0023F15FC91B77E01039039FE001FFF4901F8010113804901E0010713C049018049
+13E0017F90C7FC49484A13F0A2485B485B5A5C5A7113E0485B7113C048701380943800FE
+0095C7FC485BA4B5FCAE7EA280A27EA2806C18FCA26C6D150119F87E6C6D15036EED07F0
+6C18E06C6D150F6D6DEC1FC06D01E0EC7F806D6DECFF00010701FCEB03FE6D9039FFC03F
+FC010091B512F0023F5D020F1580020102FCC7FCDA000F13C03E437BC148>99
+D<F17FF8050FB5FCA6EF000F8484B3A892380FFF804AB512F8020F14FE023FECFF8391B7
+12E301039138807FF3499039F8000FFB011F01E00103B5FC494913004990C87E49488148
+498148834A815A485BA2485BA25AA3485BA4B5FCAE7EA46C7FA37EA26C7FA26C5F806C5F
+6C6D5D6C6D5D017F93B5FC6D6C6C0103806D6D49806D01F0D91FF7EBFFFE6D9039FE01FF
+E7010190B612876D6CECFE07021F14F8020314E09127003FFE00ECC0004F657BE35A>I<
+92380FFFC04AB512FC020FECFF80023F15E091B712F80103D9FE037F499039F0007FFF01
+1F01C0011F7F49496D7F4990C76C7F49486E7F48498048844A804884485B727E5A5C4871
+7EA35A5C721380A2B5FCA391B9FCA41A0002C0CBFCA67EA380A27EA27E6E160FF11F806C
+183F6C7FF17F006C7F6C6D16FE6C17016D6C4B5A6D6D4A5A6D01E04A5A6D6DEC3FE00103
+01FC49B45A6D9026FFC01F90C7FC6D6C90B55A021F15F8020715E0020092C8FC030713F0
+41437CC14A>I<EE3FFC0307B51280033F14C04AB612F0020715F84A9038F03FFC4AEB80
+7F913A7FFE00FFFE4A5A4B4813FF4913F05B4913E0A24913C0A27013FE4949EB7FFCEF3F
+F8EF1FF0EF07C094C7FCB0B812C0A6D8001F01C0C8FCB3B3B0007FB612FCA638657CE431
+>I<F107F8DB7FFEEC3FFE020FB5D8F001B5FC027FDAFE03148049B7128F49DCDFFD13C0
+010FD9F00FEBFFC149D9800114014990C7EBFC0349486E6C7E4948EC3FFF48496E018113
+800780130048F0C03E97C7FC48496E7FA34884A96C60A36C6D4A5BA26C60A26C6D4A90C8
+FC6D6C4A5A6D6C4A5A6D6D485BDBF00F5B4990B612C060D97C7F4AC9FCD9FC0F14F09126
+007FFECAFC92CCFC1201A47FA27F8014F091B77E18FE6CEFFFC019F06D17FC19FF6D846D
+846D846D84013F8490BAFC0003854801E0C712014890C9000F7F484816014848EE007F48
+48717E8512FF5B85A56D5F007F616D173F003F616D177F6C6C4D5A6C01C003035B6C6D4B
+5B6C01F8031F5BC601FF92B5C7FC6D01F8011F5B011F90B712F8010717E0010094C8FC02
+0F15F0DA003F01FCC9FC4A607CC151>I<903807FF80B6FCA6C6FC7F7FB3A8EF1FFF94B5
+12F0040714FC041F14FF4C8193267FE07F7F922781FE001F7FDB83F86D7FDB87F07FDB8F
+C0814C7F039FC78015BE03BC8003FC825DA25DA25DA45DB3B2B7D8F007B71280A651647B
+E35A>I<EB0FE0EB3FF8497E48B5FCA24880A24880A76C5CA26C91C7FCA238007FFC6D5A
+EB0FE090C9FCAF903807FF80007FB5FCA6C6FC7F7FB3B3AEB712C0A622657BE42C>I<90
+3807FF80B6FCA6C6FC7F7FB3B3B3B3ADB712E0A623647BE32C>108
+D<902607FF80D91FFFEEFFF8B691B500F00207EBFF80040702FC023F14E0041F02FF91B6
+12F84C6F488193267FE07F6D4801037F922781FE001F9027E00FF0007FC6DA83F86D9026
+F01FC06D7F6DD987F06D4A487F6DD98FC0DBF87EC7804C6D027C80039FC76E488203BEEE
+FDF003BC6E4A8003FC04FF834B5FA24B5FA24B94C8FCA44B5EB3B2B7D8F007B7D8803FB6
+12FCA67E417BC087>I<902607FF80EB1FFFB691B512F0040714FC041F14FF4C8193267F
+E07F7F922781FE001F7FC6DA83F86D7F6DD987F07F6DD98FC0814C7F039FC78015BE03BC
+8003FC825DA25DA25DA45DB3B2B7D8F007B71280A651417BC05A>I<923807FFE092B6FC
+020715E0021F15F8027F15FE494848C66C6C7E010701F0010F13E04901C001037F49496D
+7F4990C87F49486F7E49486F7E48496F13804819C04A814819E048496F13F0A24819F8A3
+48496F13FCA34819FEA4B518FFAD6C19FEA46C6D4B13FCA36C19F8A26C6D4B13F0A26C19
+E06C6D4B13C0A26C6D4B13806C6D4B13006D6C4B5A6D6D495B6D6D495B010701F0010F13
+E06D01FE017F5B010090B7C7FC023F15FC020715E0020092C8FC030713E048437CC151>
+I<DB0FFFEC01F04AB500E01303020F02F81307023F14FE91B7130F01030280EB801F4990
+3AFC001FC03F011F01F0EB0FE04949903803F07F490180903801F8FF90B56E7E4891C8B5
+FC48498184485B484981A248835C5A845C5AA4B55AAE7E80A37EA2807EA26C6D5D606C7F
+606C6D5D7E6C6D92B5FC6D6D5B6D6D13076D6DEB0FEF6D01F8EB3FCF6D9039FE01FF8F01
+0190B6120F6D6C14FC021F14F0020314C09139003FFE0092C8FCB3A3053FB612FCA64E5D
+7BC055>113 D<D90FFFEB0FFCB690383FFF8093B512E04B14F04B14F8923907FC7FFC92
+390FE0FFFEC6EC1F806DD93F0113FF6D133E157E157C15F8A215F07013FEA24BEB7FFCEF
+3FF8EF0FE04B90C7FCA55DB3B0B712F8A638417BC042>I<913A3FFF8007800107B5EAF8
+1F011FECFE7F017F91B5FC48B8FC48EBE0014890C7121FD80FFC1407D81FF0801600485A
+007F167F49153FA212FF171FA27F7F7F6D92C7FC13FF14E014FF6C14F8EDFFC06C15FC16
+FF6C16C06C16F06C826C826C826C82013F1680010F16C01303D9007F15E0020315F0EC00
+1F1500041F13F81607007C150100FC81177F6C163FA2171F7EA26D16F0A27F173F6D16E0
+6D157F6D16C001FEEDFF806D0203130002C0EB0FFE02FCEB7FFC01DFB65A010F5DD8FE03
+15C026F8007F49C7FC48010F13E035437BC140>I<EC07E0A6140FA5141FA3143FA2147F
+A214FF5BA25B5B5B5B137F48B5FC000F91B512FEB8FCA5D8001F01E0C8FCB3AFEF0FC0AC
+171F6D6D1480A2173F6D16006F5B6D6D137E6D6D5B6DEBFF836EEBFFF86E5C020F14C002
+035C9126003FFCC7FC325C7DDA3F>I<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 D<B612FEA71F077F9C27>I<120FEA3FC0EA7FE0EAFFF0A6EA7FE0EA3FC0EA0F
+000C0C768B21>I<EC1FF891B5FC010314C090390FF81FF090391FC003F849486C7E017E
+C7127E49800001168049141F4848EC0FC0000716E0491407000F16F0A34848EC03F8A200
+3F16FCA44848EC01FEA700FF16FFB3A5007F16FEA56D1403A2003F16FCA4001F16F8A26D
+1407000F16F0A26C6CEC0FE0A26C6CEC1FC0A26C6CEC3F806C6CEC7F00017F14FE6D6C48
+5A6D6C485A90390FF81FF00103B512C0010091C7FCEC1FF830517BCE3B>48
+D<14075C5C147F5C1307133F000FB5FCB6FC13F913C1EAF0011200B3B3B3A7497F010F13
+E0B712FEA4274F75CE3B>I<EC7FE0903803FFFE010F6D7E013F14E0D9FF0013F8D801F8
+EB1FFCD803E06D7E4848EB03FF48486D138090C813C0001E16E0001C157F003CED3FF012
+380078ED1FF81270A2B4ED0FFC13C07FA66C5A6C5A000EC8FCC9EA1FF8A317F0163FA2EE
+7FE017C016FF17804B1300A24B5A4B5A5E4B5A4B5A4B5A5E4BC7FC15FE4A5A4A5A4A5A4A
+5A5D4A5A4AC8FC147E5C4948141CEB03E0495A4948143891C8FC131E5B5B491578485A48
+481570484815F048B7FCA25A5A5AB812E0A42E4F7ACE3B>I<EC3FF849B57E010F14E090
+391FC01FF890397E0003FC01F86DB4FCD801E06D13804848EC7FC0484815E048C8123F01
+C015F013F0486CEC1FF87FA56C5AA2EA03E0C9EA3FF0A317E0167F17C016FF17804B1300
+5E4B5A4B5A4B5AED3FC0DA07FFC7FC903803FFFC5DEDFF8090C7EA1FE0ED07F8ED01FE6F
+7EEE7F8017C0EE3FE0EE1FF017F8A2EE0FFC17FEA2160717FFA3120FEA3FC0487E487EA4
+17FE160F5B6C4815FC90C8FC0078ED1FF87E003EED3FF06CED7FE06C7E6C6CECFFC0D803
+F0491380D801FC903807FE003A00FFC01FFC013FB512F0010F14C0010391C7FC9038003F
+F830517BCE3B>I<000316C001C0140301F8141F903AFFC003FF8091B612005E5E5E16E0
+16804BC7FC019F13F8018113800180C9FCB0EC0FF0ECFFFE01836D7E903987F01FE09039
+9F0007F801BE6D7E01F86D7E496D7E49EC7F805BEE3FC04915E0C9121F17F0A317F8160F
+A317FCA5120EEA3F80487E12FF7FA217F85B161F5B48C813F012700078ED3FE0A26C16C0
+167F6CEDFF80001F16006C6C495A6C6C13036C6CEB07F8D801F8EB1FF06CB4EB7FE06DB5
+1280011F49C7FC010713F8010013C02E517ACE3B>53 D<ED3FE0913803FFFC020F13FF91
+393FE01F8091397F0007C0D901FCEB01E04948EB00F0495A494813034948EB0FF8494813
+1F49C7FC13FEA2485A120349EC0FF00007ED03C093C7FC485AA2121F5BA2123FA3127F5B
+EC0FFF023F13C091B512F03AFFC1F003FC9039C3C000FED9C780137F91C7EA3F8001CE15
+C001DCEC1FE0160F01F815F0EE07F85B17FCA24915FE1603A34915FFA4127FA66C7EA317
+FE121FA216076C6C15FCA2000716F86D140F000316F06DEC1FE012016C6CEC3FC06DEC7F
+806D6CEBFF006D6C485A90390FF80FFC6DB512F0010114C06D6C90C7FCEC0FF830517BCE
+3B>I<121EA2121F13F090B812C0A4481780A218005FA2003CC9123C00385E0078167017
+F000704B5A5F16034C5A94C7FC485D161E5EC9123816785E5E15014B5A5E15074BC8FCA2
+151E153E153C157C157815F8A24A5AA21403A25D1407A2140FA25D141FA3143FA3147F5D
+A414FFA65BAC6D90C9FC143C32537AD03B>I<EC1FF891B5FC010314E090390FF00FF890
+391F8001FC017EC77E49EC3F80D801F0141F0003ED0FC04915E048481407EE03F0120F49
+15F81601121FA37FA36D14036D15F07F6C6CEC07E07F6D6CEB0FC06C6D131F02F0EB3F80
+6C6D14006C01FE137E6E485A6CECC3F06DEBE7E0011FEBFF806D49C7FC01037F6D806D6C
+13E091B57E010314FCD90FC77FD93F817FD97E0014C049133F48486D13E04848010713F0
+48486D13F848481300001FED7FFC49141F48C8EA0FFE1607007E1503EE01FF8212FE4816
+7FA2173FA56C163E127E177E007F167C6C16FC6D15F86C6C14016C6CEC03F06DEC07E06C
+6CEC0FC06C6CEC3F80C6B4ECFF0090397FE007FC011FB55A010714E0010191C7FC903800
+1FF830517BCE3B>I<EC1FF891B5FC010314C090390FF00FE090391FC003F890397F8001
+FC01FEC77E0001157F4848EC3F805B0007ED1FC0484815E0001F150F4915F0123F160700
+7F16F85BA217FC12FFA2160317FEA617FFA35E127FA37F003F5DA2121F6D5C000F151B00
+07153B7F6C6C1473000115E36C6C1301017FEB03C3903A3FC00F83FE010FB51203010313
+FC010013F091C7FC160717FCA317F8A2160F17F0A2161FD803C015E0EA0FF0486CEC3FC0
+1780167F170016FE150149495AD80FC0495A90C7485A6C6C495A01E0495A2703FC01FFC7
+FC6CB55A6C6C13F8011F13E0010390C8FC30517BCE3B>I<120FEA3FC0EA7FE0EAFFF0A6
+EA7FE0EA3FC0EA0F00C7FCB3A9120FEA3FC0EA7FE0EAFFF0A6EA7FE0EA3FC0EA0F000C33
+76B221>I<EE7FF80307B57E033F14F09239FF8007FCDA03F8C7127FDA0FC0EC0FC0023F
+C8EA03F0027CED00F84A167CD903E0161F4948707E4948707E49CA6C7E013E717E013C17
+0049187849DA1FE0804848DAFFFC80030713FF484890270FF01F807F484890273FC007C0
+EB078092397F0001F048C700FE6D6CEB03C04A481478000E01036F1301001E49486E14E0
+001C4A91380FF800003C010F7013F00038494802071470A20078494802031478A200701A
+384A5AA200F01A3C481A1C4AC8FCAB6E7E7E1270A26E7E12781B3800386D6C1407A2003C
+6D6C140F001C1307001E6E021F1470000E6D6C143F000F0101157B6E6CDAF9FE13E06C6C
+017FD901F1130192273FC007C0EB03C06C6C903C0FF01F807F07806C6C6DB539003FFF00
+030001FCEB0FFE6C6CDA1FE0EB03F8017891CBFC7F133E7F6D7E6D7E6D6CEF01FCD900F8
+1707027CEF3FF0023F933801FF80DA0FC092381FFE00DA03F8913801FFF0912600FF8090
+B5C7FC033FB612F8030792C8FCDB007F13804E557AD35B>64 D<EE03804C7EA34C7EA34C
+7EA34C7EA34C7EA24C7E16E7A203017F16C3A20303801681A2DB07017F82A2030E80177F
+A24B80173FA24B6D7EA20378800370130FA203F0804B1307A20201814B7FA24A488183A2
+4AC78083A2020E82187FA24A6F7E021FB7FC4A82A30278C8EA1FFC0270150FA202F0824A
+1507A249488284A249488384A249CA7FA24984010E177FA2011E84193F133E017F844848
+6C4C7E000F01E04B487EB500FE037FEBFFFEA44F557CD458>I<B812FEEFFFC018F818FE
+26007FF8C73807FF806D4802017F011F6F6C7E727E727E727E727EA2727EA2721380A21A
+C0A384A360A21A80A2601A00A24E5A180F614E5A4E5AF0FFE04D1380050790C7FCEF7FFC
+91B712E08418FE02F0C73801FF809438007FE0F01FF8727EF003FE857213807213C0F17F
+E0A2F13FF0A21AF8191FA21AFCA81AF8193FA21AF0197FF1FFE0A24E13C04E1380604E13
+00F03FFC013FEEFFF8496C02075BBA12C096C7FC18FC18C046527AD153>I<BA12FCA426
+007FFCC712016D489138001FFE011F160318011800197E193EA2191EA285A385A6F10380
+A2171CA296C7FCA5173CA3177C17FC1601160F91B6FCA49138F8000F16011600177C173C
+A3171CA794C9FCB3497E49B4FCB712E0A441527BD14C>70 D<DC1FFC14060303B56C130E
+031F02F0131E037F14FC912801FFF801FE133E0207903980001F80DA1FFCC73807C07EDA
+3FF0913803E0FEDAFFE0EC00F049018015794990C9123D4948161F4948160F4948160749
+5A494816034A160113FF484916004890CBFC1A7E485AA24848183EA2121F49181EA2123F
+5B1A0E127FA397C7FC5B12FFAE127F6D4BB612FEA4003F93C7003F13806D94380FFE0019
+07121FA27F120FA26C7EA26C7EA26C7F6C7F137F806D7E6D6C160F6D7E6D7E6D6C161F6D
+01C0153D6D6D157DDA3FF815F8DA1FFE913803F07E912607FFC090380FE03E020101FC90
+387F801E6E6CB538FE000E031F02F81306030302E090C7FC9226001FFEC9FC4F567AD35C
+>I<B70107B612F8A4C66C48C80003EBF0006D486F5B6D486F5BB3AD91B9FCA402F8C9FC
+B3B1496C4B7F496C4B7FB70107B612F8A44D527BD158>I<49B612FEA490C7003F138092
+380FFE001507B3B3B3A21206EA3FC0487E487EA44B5AA25B007F5D0180131F0078C75B6C
+143F003E4A5A6C5D6C6C495A2707E003FEC7FC3901FC07FC6CB512F0013F13C0D907FCC8
+FC2F547BD13C>74 D<B500FC95B512FCA36E5FD8007FF2F800D93DFF943803BFF0011D62
+A2011C6DEE073FA36E6C160EA36E6C161CA26E6C1638A36E6C1670A36E6C16E0A36E6CED
+01C0A26E6CED0380A36E6DEC0700A36F6C140EA36F6C5CA26F6C5CA36F6C5CA36F6C5CA2
+6F6C495AA36F6C495AA36F6D48C7FCA393387FC00EA2706C5AA3706C5AA3706C5AA3706C
+5AA270B45AA3705BA3013E6E90C8FC137F496C4E7E000701F0027E4B7EB66C4BB612FC17
+3CA35E527AD16B>77 D<B500FC030FB512F8A28080D8003FDC007F13006D6DED0FF8735A
+011D6D6F5A011C6D6F5AA26E7E81143F6E7E81140F6E7E82806E7F82806F7E82153F6F7E
+A26F7E6F7EA26F7F83816F7F83167F707E83161F707E838270138018C0827013E0A2EF7F
+F0EF3FF8A2EF1FFC18FE170FEF07FF1981837113C119E183F07FF119F9183FF01FFD19FF
+8484A28484A284A2197F193F133E017F171F496C160F000713F0B66C15071903A219014D
+527BD158>I<EE7FF80307B57E033F14F09239FFC00FFC913A03FE0001FFDA0FF8903800
+7FC0DA3FE0EC1FF0DA7F80EC07F84AC86C7E49486F7E49486F7E4948707E4948707E4948
+707E4948707E017F844948707E91CA120348854848717EA24848711380A2000F1AC04918
+7F001F1AE0A34848F03FF0A3007F1AF8A249181FA300FF1AFCAE6C6CF03FF8A5003F1AF0
+6D187FA2001F1AE0A26D18FF000F1AC0A26C6C4D1380A200031A006D5F6C616C6D4C5A6E
+160F017F606D6C4C5A6D6C4C5AA26D6C4C5A6D6C4C5A6D6C4B90C7FCD900FFED03FCDA7F
+C0EC0FF86E6C4A5ADA0FF8EC7FC0DA03FE4948C8FC913A00FFC00FFC033FB512F0030714
+809226007FF8C9FC4E567AD35B>I<B812C017FEEFFFC018F026007FFCC713FC6D48EC0F
+FF011F03017F9438007FE0727E727E727E180785727EA28684A286A762A26097C7FCA24E
+5A614E5A4E5A4E5AF0FFC04D90C8FCEF0FFEEFFFF891B712C04DC9FC839126F8000113C0
+9338003FF0EF0FFC717EEF01FF85717F727EA2727EA2727EA985A81B0785180FA21B0F06
+07140E496C82496C6F141EB76EEB801C72EBC03C96387FE0F896381FFFF0CC000713E096
+38007F8050547BD156>82 D<DA3FF0130349B55B010714C0011FECF00F903A7FE00FF81F
+49C712FED801FCEC3F3F4848EC1FBF48486EB4FC48481403485A4980003F8190C97E5A83
+127E8312FEA283A37E837FA27F007F93C7FC7F7FEA3FFC7F6C6C7E14F86CEBFF806C14F8
+EDFF806C15F06C15FE6C6C806D15C0010F81010315F8D9007F80140F020080030F7F0300
+1480161F040713C0160182EF7FE0A2173FEF1FF0A200E0160FA31707A37EA318E07E170F
+7E18C06C161F6C17806D153F6D16006D157E6D15FED8FCFC4A5A017F4A5A26F83FC0EB0F
+F0D90FFEEB7FC0D8F003B65A48C64AC7FC023F13F848010113C034567AD341>I<003FBB
+12C0A449C79038F0000701F06E48130001C0183F48C8EE0FE0007E1907007C1903A20078
+1901A400701900A500F01AF0481A70A6C91700B3B3AC4C7E030313FC027FB712E0A44C51
+7CD055>I<B600F8010FB66C010FB512E0A4000149C8001F01E0C8EBFE0026007FF80307
+0180ED3FF04A94C9EA0FE0013F7060785A6E83011F7095C7FCA26E83010F70170EA2866D
+6C4B5FA36D6C922603BFF05DA36F9126071FF815786D1C70A26F020F6D15F06DDC0E0F5E
+A26F021E6D1401027FDB1C075EA26F023C7F023FDB38034B5AA2876E6C4A6C4BC8FCA36E
+6C4A6C6D130EA36F49486D6C131E02071A1CA26F01036F133C6E4B013F1438A2DC80076F
+13786E92C7001F1470A27048816E020E020F5CA2876F6C480207495AA36F6C486E6C485A
+A370486E1387031F96C9FCA2DCFCF016CF030F496E13CEA204FF17FE6F496F5AA36F496F
+5AA36F90C96C5AA36F48705AA34C1607047C5FA30438705A73547ED178>87
+D<ECFFC0010F13F8013F13FE9039FF00FF80D801F0EB3FE0D803C0EB0FF0486C6D7E01F8
+6D7E000F816D13016F7EA3707E6C5AEA01E0C9FCA6ED3FFF020FB5FC9138FFFC7F010713
+00EB1FF0EB7FC04848C7FCEA03FC485A485A485A123F5B485A187012FF90C8FCA216FFA3
+5D6D14BF007F14036DEB073F6C6C90390F1FC0E06C6C131E6C6C90393C0FE1C02707FE01
+F013FF0001B5486C13806C6C90398003FE00D907FCC712F834367BB43B>97
+D<EB7F80B5FCA41203C6FC137FB3A6ED07FC92387FFF800281B512E0913987F00FF89139
+8F8001FC029EC7B4FC02BC6E7E02F86E7E4A6E7E4A6E7E4A1407844A6E7EA2841701A284
+A283A21980AB19005FA360A24D5AA24D5A804D5A6E5D6E4A5AD97E784A5A6E4AC7FCD97C
+1EEB01FE6E495A903A7807E01FF00201B512C0902670007F90C8FC90C7EA0FF839547DD2
+41>I<EC0FFE91387FFFE049B512F8903907F801FE90391FE0001FD93F80EB078049C7EA
+0FC001FE143F484815E00003157F485A485AA2485AEE3FC0003FED0F004991C7FCA2127F
+A35B12FFAB127F7FA3123F6D1570121F6D15F0000F16E06D140112076C6CEC03C06D1580
+6C6C14076C6DEB0F00D93FC0131E6D6C137C903907FC03F06DB55AD9007F1380DA0FF8C7
+FC2C367CB434>I<17FF4BB5FCA4ED0007160182B3A6EC0FF8EC7FFF49B512E0903907FC
+03F090391FE0007C49487F49C7120F01FE80484880485A000781484880A2485AA2485AA2
+127FA35B12FFAB127FA27FA2123FA27F121FA26C6C5C00075D7F6C6C5C6C6C5C6C6C021E
+7F6D6C017C13E0D91FC049EBFF8090390FF807E00103B512800100495ADA1FF091C7FC39
+547CD241>I<EC0FF891B5FC010314C090390FF80FF090391FC003FC90397F8001FE49C7
+7E4848EC7F804848143F49EC1FC0485A000FED0FE05B001F16F01607485AA2007F16F8A2
+5B160312FF90B7FCA30180C9FCA8127F7FA2123FA26D1538121F17786C6C1570000716F0
+6D15E06C6C14016C6CEC03C06C6C15806D6C130F6D6CEB1F00D90FF0133C903907FE01F8
+0101B512E06D6C1380DA07FCC7FC2D367DB434>I<157F913803FFE0020F13F091383FC0
+F891387F01FC903901FE03FE903803FC0714F81307EB0FF0A290391FE003FCED01F892C7
+FC495AB3B612FEA426003FC0C7FCB3B3A580EBFFF0007FEBFFF8A427547DD324>I<EF1F
+C0DA3FE0EBFFE0902701FFFC0313F001079039FF07E1F8903A1FE03FCF01903A3F800FFC
+03903A7F0007F80101FE010314F04848903901FC004000036F1300491300000781A24980
+000F82A8000793C7FC6D5CA200035D6D130100015D6C6C495A017F495A6E485A9039FFE0
+3FC0D801C7B5C8FC01C113FC3903803FE091CAFCA57FA27F7F7F6CB612E016FF6C16C017
+F0013F15FC8390B8FCD803F8C7001F1380D80FE0020113C04848EC007F4848ED1FE090C9
+120F127EEF07F012FE481603A56C1607007E17E0007F160F6C6CED1FC06C6CED3F806C6C
+ED7F006C6C15FED803FCEC03FCC6B4EC0FF0D93FF0EBFFC0010FB6C7FC010114F8D9001F
+1380354E7DB43B>I<EB7F80B5FCA41203C6FC137FB3A6ED07FC92383FFF8092B512E091
+3981F00FF8913983C007FC9139870003FE028E1301029C6D7E14B814B002F06E7E5CA25C
+A35CB3AD2601FFE0903801FFE0B600C0B612C0A43A537CD241>I<1378EA01FE487E487F
+A66C90C7FC6C5AEA007890C8FCB0EB7F80B5FCA41203C6FC137FB3B3A43801FFE0B61280
+A419507CCF21>I<EC0780EC1FE0EC3FF0EC7FF8A6EC3FF0EC1FE0EC078091C7FCB0EC0F
+F8EB1FFFA4EB003F140FA21407B3B3B2120C003F14F0387F800FEAFFC015E0141F15C0EC
+3F80EA7F809038007F006C13FC6CB45A000713E0C690C7FC1D6885CF24>I<EB7F80B5FC
+A41203C6FC137FB3B3B3B13801FFE0B612C0A41A537CD221>108
+D<01FFD907FEEC03FFB590261FFFC0010F13E0037F01F0013F13F8912701F80FFC9038FC
+07FE913D03C003FE01E001FF000390260700019038038000C6010E6D6C48C76C7E6D48DA
+7F8E6E7E4A159CA24ADA3FF86E7E02605D14E04A5DA34A5DB3AD2601FFE0DAFFF0EC7FF8
+B6D8C07F9026FFE03FB512F0A45C347CB363>I<01FFEB07FCB590383FFF8092B512E091
+3901F00FF8913903C007FC000349C66C7EC6010E13016D486D7E5C143002706E7E146014
+E05CA35CB3AD2601FFE0903801FFE0B600C0B612C0A43A347CB341>I<EC0FFC91387FFF
+8049B512E0903907F807F890391FE001FE90393F80007F017EC7EA1F80496E7E48486E7E
+00038248486E7EA248486E7EA248486E7EA2003F82A24848ED7F80A400FF17C0AB007F17
+80A26D15FFA2003F1700A2001F5E6D1401000F5E6D140300075E6C6C4A5A6C6C4A5AA2D8
+007FEC3F806D6C49C7FC90391FE001FE903907F807F86DB55AD9007F1380DA0FFCC8FC32
+367CB43B>I<90397F8007FCB590387FFF800281B512E0913987F00FF891398F8003FC00
+0190399E0001FF6C01BC6D7FD97FF86E7E4A6E7E4A6E7E4A140F844A6E7EA2717EA3717E
+A4711380AB4D1300A44D5AA24D5AA2606E140F4D5A6E5D6E4A5A6E4A5A02BC4AC7FC029E
+495A028FEB07FC913987E01FF00281B512C0DA807F90C8FCED0FF892CAFCB13801FFE0B6
+12C0A4394B7DB341>I<01FFEB1F80B5EB7FF0913801FFF8913803E1FC91380783FE0003
+EB0F07C6131EEB7F1C1438143091387003FC91386000F0160014E05CA45CB3AA8048487E
+B612F0A427347DB32E>114 D<D907FE13C090387FFF8148B512E33907F803FF390FC000
+7F4848133F48C7121F003E140F007E1407127C00FC1403A315017EA27E7F6C6C90C7FC13
+F013FF6C13F86CEBFF806C14E06C14F86C14FEC680013F1480010714C0D9003F13E01403
+9138007FF0151F00E0140FED07F8A26C1403A215017EA36C15F0A26C14036C15E015076D
+EB0FC06DEB1F80D8FDF0EB3F0039F8FC01FE39F07FFFF8D8E01F13E0D8C00390C7FC2536
+7CB42E>I<EB01C0A71303A41307A3130FA2131FA2133F137F13FF5A5A001F90B512E0B7
+FCA326003FC0C7FCB3A71638AC6E1378011F1470A26D6C13F016E0903807F801903903FC
+03C0903901FE07806DB51200EC3FFCEC07F0254B7EC92E>I<D97F80EC7F80B591B5FCA4
+00031503C61500017F157FB3AC17FFA35EA3013F5C6EEB077FA2011F020E7F6D6C011C13
+F06E0178EBFFC0903903FC01F06DB512E06D6C1380912607FC00EB80003A357CB341>I<
+007FB5D8800FB51280A4C69026FC0003EBF000D93FF86D1380011F4BC7FC010F15F80107
+5D6D6C5C6E495A6D6C5C6D14076E6C48C8FCEDC01E6E6C5A021F133891380FF0786F5A91
+3807FDE002035BEC01FF5E80157F6F7E824B7E15FFEDE7F802017F913803C3FEEC07814A
+C67E020E80021E6D7E4A133F4A6D7E4A80707E4948130749486D7E010781010F6E7E013F
+8201FF8200076D010713F0B500F8011FEBFFE0A43B337FB23E>120
+D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fi cmr17 20.74 26
+/Fi 26 120 df<EA0780EA1FE0EA3FF0EA7FF8EAFFFCA6EA7FF8EA3FF0EA1FE0EA07800E
+0E728D2B>46 D<ED0FFC92B512C0020314F091390FF807FC91393FC000FF4AC7EA3F80D9
+01FEEC1FE0D903F8EC07F049486E7E49486E7E49486E7E013F824A8149C96C7EA201FE70
+7E000184A24848707EA34848707EA2000F84A34848707EA4003F84A54848701380A900FF
+19C0B3AC007F1980A56D5EA3003F1900A5001F60A26D1607A2000F60A36C6C4C5AA30003
+606D161F000160A26C6C4C5AA26D6C4B5A013F94C7FC6E5D6D6C4A5A6D6C4A5A6D6C4A5A
+6D6C4A5A6D6C4A5A6D6C4A5ADA3FC001FFC8FC91390FF807FC0203B512F0020014C0DB0F
+FCC9FC42757AF14F>48 D<ED7FF00207B57E023F14F091B612FC4915FF902707FE007F13
+C0D90FE0010F7FD91F80010113F849C87F017CED3FFE496F7E48486F138048486F13C048
+48817113E0484817F090CAFC48EF7FF8121E003EEF3FFC123CA2007CEF1FFE1278A2EA7F
+C0D8FFF0EE0FFF7F7F7FA76C5A6C5A6C5AD807C0EE1FFECBFCA3F03FFCA3F07FF8A219F0
+18FF19E05F19C04D1380A24D130060170F4D5A604D5A4D5A604D5A4C90C7FC4C5A4C5A5F
+4C5A4C5A4C5A4C5A94C8FC16FE4B5A4B5A4B5A4B5A4B5A4B5A4BC9FC157E5D4A5A4A5A4A
+5A4A5A4A4815074AC9FC143E4A160E5C495A495A495A495A49CA121E011E171C5B5B4917
+3C485A4848177C4848EE01FC48B912F8A25A5A5ABAFCA219F0A3407279F14F>50
+D<ED1FFE4AB512E0020F14FC023F14FF9126FFE00713C0D903FEC713F0D907F0EC3FF8D9
+1FC06E7E49C8EA07FE017E6F7E017883496F7F48486F7F120349834848167F01F88313FE
+6D6C153F486D82A4805CA37E6C5B6C48C95BD80078167F90CAFCA261A218FF61A24D5B61
+5F96C7FC4D5A60170F4D5AEF3FE04D5A4D5A4C48C8FCEE07FCEE1FF092381FFFC091260F
+FFFEC9FCA2EEFFE091C7EA07FCEE00FFEF3FC0EF1FF0717EEF07FE717E717F717F85727E
+727EA285727EA2727EA31A80A2841AC0A3EA07E0EA1FF8487E487EB5FCA51A80605BA26C
+48180013F001C05E007CCA5B7E4E5A7E6D4C5A6C6C5F000717FF01F04B5B6C6C4B5B6C6C
+5F6CB4030F90C7FC6D6C4A5AD93FF04A5AD90FFCECFFF8902707FFE00713E0010190B612
+806D6C92C8FC020F14F8020314E09126001FFEC9FC42757AF14F>I<BA12FCF1FFE01AFC
+F2FF801BE0D8003F01E0C8000F13F801074903007F4BEE3FFF6D060F7F747F08017F747F
+757E757E757E8887751380A21DC0871DE087A31DF0A387A363A31DE0A2631DC0A2631D80
+511300A2515A515A515A515A505B505B505B081F90C7FCF23FFCF2FFF0070713C0077F90
+C8FC92B812F8621AFF0380C8000313E09638003FF8F20FFE973803FF807413E0746C7E75
+7E757E757E757E7513801DC07513E0A27513F0F47FF8A21DFC1C3FA21DFE1C1FA21DFFAA
+1DFEA21C3FA21DFC1C7FA2F4FFF8A25113F0631DE05113C051138063511300F3FFFE505B
+08075B49061F13E06F047F5B013F6D0307B5C7FCBC5A1BF01BC050C8FC1AC0607678F571
+>66 D<BD12F8A5D8003F01F0C98001074916074B16006D193F1B1F1B071B031B011B0088
+1C7EA21C3EA21C1EA31C0EA21C0FA388A6F40380A3191CA299C7FCA7193CA4197CA219FC
+18011803180F18FF92B7FCA503C0C7FC180F180318011800197CA2193CA4191CA996CAFC
+B3AB497F81013F13FEB812E0A5597678F568>70 D<DE7FFCED01C0050FB512C094B600F8
+1403040315FE041F6F6C1307047FD9F00013E04B4848C7D80FF0130F030701F0EC03FC4B
+0180DA00FE131FDB3FFEC9123FDB7FF893381F803F4A4848EE07E04A01C0933803F07F4A
+4916014A90CBEAF8FFDA1FFC187C4A48183F4A48844A5A498649498449498492CCFC4948
+85131F4A85495A017F1B7F5C01FF1B3F5C5A4A1A1F5AA248491A0FA25A91CE1207A25A5B
+A2003F1C03A25BA2127F9AC8FCA45B12FFB26C7EA3083FB712F8A3123F7F97C7ECF8000A
+0F13E0001F755B887F7EA2807EA26C7FA26C7FA27E806D7EA26D7E131F806D7E7F816D7F
+6D6D606D7F6E7E6E6C606E6C606E7E6E01C0173E6E6DEF7E7F6E6DEFFC3F9126007FFCEE
+01F86FB4933807F01F030F01C092380FE00F6F01F8ED7F80030101FF913901FF00076F6C
+01F8D93FFC1303041F90B600F01301040304C01300040093CAFC050F14F09426007FFECB
+FC6D7C78F87D>I<B600E04CB612FCA28181A2D8000F6DDC000714000103070013F86FF0
+3FE0DABFFF725A149F028F6D715AA202876D71C7FC82148302817F82148082157F6F7E82
+8183816F7F83816F7F838183167F707E83828482707F84828482707F84177F717E848385
+83717F85838583717F85187F85183F727E8684727F86848684727F86197F86193F737E1B
+80857313C0A27313E01BF0857313F81BFC1A7F1BFE1A3FF21FFF1C87861CC7867413E71C
+F7867413FFA287A28787A287A28787497E87497E87496C85EB7FFC0003B56C84B600FE84
+A288A288667678F577>78 D<B912FCF0FFF019FEF1FFC01AF8D8003F01F0C7000713FE01
+07499139003FFF804B03077F6D050113F0736C7E747EF20FFF747F747F86747F88757EA2
+757EA2757EA288A28789A99AC8FCA263A264A2515A641B7F64515A64505B5090C9FC505A
+505AF23FF8F27FE0963801FF80DF0FFECAFCF17FF895380FFFE092B8CBFC19F019FC03C0
+C7380FFF80060113E09538003FF8F11FFEF107FF737F7313E0737F747E1A3F87747E1A0F
+878688A3747FAB88AC1F101F38747FA47416787614701B7F496D1BF0756C14E0013F01FC
+051F1401B8707E0907EC03C0756CEB0780759038800F009839007FE03ECF381FFFFC0A07
+5B9938007FC06D7978F575>82 D<001FBE12F8A502F8C7000F01F0C7121F4801806E4902
+0113FC01FCC86C49EC003F491B1F01E01B07491B03491B0190C91800A2003E1D7CA2003C
+1D3CA3481D1EA500701D0EA8481D07A6CA1900B3B3B3B14D7F4D7F057F13FE031FB812F8
+A568757BF473>84 D<B700F00503B612C0A5C602FCCC003FEBFC00011F01E0070F13E06D
+497313807748C7FC6D64775A7F6F627F666F19036D64811D07027F6381023F50C8FCA26F
+61021F1A1E811D3E6E1A3C826E62A27018F86E62821C016E62826E4F5AA2701707037F61
+821C0F033F96C9FC82031F181EA270173E6F183C831C7C6F1878836F60A27115016F6083
+1B036F6083047F4C5AA271150F043F94CAFC8363041F161E83705EA272147C701678841B
+F8705E84704B5AA2721303705E841A07057F5D84053F4ACBFCA2725B051F141E841A3E71
+143C1980715CA2F1C0F8715C19E019E1715C19F171EBF3C0A219FF725BA37290CCFCA272
+5AA3725AA3725AA2725AA3725A72797EF577>86 D<913803FF80021F13F891B512FE903A
+03FC01FF80903A07E0003FE0D91F80EB0FF8013EC76C7E496E7E01F06E7E48486E7F717E
+4848153F4982D807A06F7E13FC487E6D6F7E80A2717EA46C90C8FC6C5A6C5ACAFCA6EE07
+FF0303B5FC157F913903FFFE07021F138091387FF800903801FFC0010790C7FCEB1FFCEB
+3FF0EBFFE0485B485B4890C8FC5B485A485AA2485A1A0E485AA312FF5B170FA4171FA26D
+153F007F163B177B6DDBF1FE131C003F16E16C6C14016C6C912603C0FF13386C6CEC0F80
+6C6C6C903A1F007F80706C6D017CECE1E028007FF803F8EB3FFF011FB500E06D13800103
+91C7000713009026003FF8EC01FC474D79CB4F>97 D<ED07FE92387FFFE00203B512FC91
+390FFC01FF913A3FE0001FC0DA7F80EB03E0D901FEC812F84948157C4948814948814948
+81013FEE0780494815034948ED0BC048177F91C9EAFFE048485D00075EA2485AA2485AA2
+7113C0003F70138049EE7F0095C7FC127FA35BA212FFAE127F7FA4123F7FA2121F6D1738
+120F19786C6C1770A26C6C17F019E06C6D15016C18C06D6C15036D6CED07806EED0F006D
+6C151E6D6C153ED903FE5D6D6C15F06D01C0EB03E0DA3FF0EB0FC0DA0FFE01FFC7FC0203
+B512FCDA007F13E0030790C8FC3D4D7BCB46>99 D<ED1FFC4AB512C0020714F091391FF0
+0FFC91397F8001FFD901FEC7EA7FC049486E7E49486E7E49486E7E49486E7E49486E7E49
+48140101FF824890C91380A24848EE7FC0A2485A000FEF3FE05BA2001F18F0181F485AA3
+007F18F8A349160FA212FF90B9FCA301E0CBFCAB127F7FA3123FA36C7EA219386C7E1978
+000718707F000318F06C6C17E018016C6DED03C06D6C1680013F16076D6CED0F006D6C15
+1E6D6C5D6D6C5D6DB44A5A6D6C6C495ADA3FE0EB1F80DA0FFE01FEC7FC0203B512F8DA00
+7F13E0DB07FEC8FC3D4D7BCB46>101 D<F103F8F13FFEDB1FF891B5FC92B5903903FC07
+8002079139E007E01F913D1FF00FF81F803FC0913B3FC003FC3E0002FFC7B45A49486E5A
+49486E5A49486E48EB1F8049486E6CEB060097C7FC49486E7E013F82A249486E7EA201FF
+82A24A80A24884AA6C95C8FCA26E5CA2017F5EA26D6C4A5AA2011F5E6D6C4A5AA26D6C4A
+5A6D6C4A5A496C4A5A6E4AC9FC903A0F3FC003FC903A1E1FF00FF80207B512E0D91C0091
+CAFC013CEB1FF892CCFCA25BA3137CA4137EA27F8080EB1FF091B612FE6DEDFFF818FF6D
+17E06D17F8010017FE010383010F84D93FE0C7000114E001FFC9120FD801FC04017F4848
+9338003FF84848171F4848717E48481707003F727E49170148CBFC737EA200FE85A76C61
+6C616D1701003F616D17036C6C4D5A6C6C4D5A6C6C4D5A6C6C4D5A6C6C4D5A26007F80DB
+01FEC7FCD93FE0ED07FCD90FF8ED1FF0D903FFEDFFC0010001F8011F90C8FC021FB612F8
+02011580DA000F01F0C9FC4A707DCC4F>103 D<131EEB7F80497E487F487FA66C5B6C5B
+6D5A011EC7FC90C8FCB3A7EB01F0EA07FFB5FCA51201EA007F133FA2131FB3B3B3A3497E
+EBFFFEB612FCA51E727AF12A>105 D<EB01F0EA07FFB5FCA51201EA007F133FA2131FB3
+B10507B512FEA5050114C07149C7FC19F019C0614EC8FC60EF01F04D5A604D5A4DC9FC17
+3E5F5F4C5A4C5A4C5A4C5A4CCAFC163C5E16FC15014B7E4B7E5D033F7F037C7F5D9139F1
+F07FE09139F3E03FF0ECF7C09139FF801FF8ED000F02FC804A6D7E4A13034A80707F8284
+717E173F84717E170F84717EA2717E717FA2717F727EA2727E85181F858585496C83D9FF
+FC037F13F0B600FC0103B612C0A54A787AF753>107 D<EB01F0EA07FFB5FCA51201EA00
+7F133FA2131FB3B3B3B3B3AC497EEBFFFEB612FEA51F787AF72A>I<D901F0902601FFC0
+ED0FFED807FF021F01FC92B512E0B5027F01FF020314F8922601FC0101C090390FE00FFE
+922803E0003FE090391F0001FFDB0F80D91FF8017C6D13C04BC7000F4A147FC6023C9127
+07FC01E06E7E013F496E6C48486E7E011F0170DA01FF496E7E03F0160790260FF1E04CC8
+FCDAF3C06E019E6F7E4B169C02F717BC92C913B802FFDC7FF86F7E4A5FA34A5FA44A5FB3
+B3A8496C4C6C4B7ED97FFF030301F8031F13C0B7D88007B600FC013FB612E0A57B4B7ACA
+86>I<D901F0903803FF80D807FF021F13F8B5027F13FE923A01FC03FF80923A03E0007F
+E0DB0F80EB1FF0031EC76C7EC65C013F496E7E011F496E7E5DEB0FF1DAF3C06E7E5D14F7
+92C9FC02FF835CA35CA45CB3B3A8496C4B7FD97FFF030713F0B7D8800FB612F8A54D4B7A
+CA58>I<ED07FE92387FFFE00203B512FC91390FFC03FF913A3FC0003FC04AC7EA0FE0D9
+01FEEC07F8D903F8EC01FC49486E7E4948157F49486F7E49486F7E017F8349C96C7E4916
+070001844848707EA2000784491601000F84A24848701380A2003F19C0A349177F007F19
+E0A412FF1AF0AD007F19E0A26D17FFA2003F19C0A46C6C4C1380A2000F1900A26C6C4C5A
+A26C6C4C5A0001606D160F6C606D6C4B5A6D6C4B5AA26D6C4B5AD907F003FEC7FCD903FC
+EC03FC6D6C4A5A6D6C6CEB1FF0DA3FE0EB7FC091270FFC03FFC8FC0203B512FCDA007F13
+E0DB07FEC9FC444D7BCB4F>I<D903E0EB1FE0D80FFFECFFFCB501037F923907E01F8092
+391F807FC092383E00FF4B4813E000011478D8007F13F090383FE1E015C0EB1FE39126E7
+800013C0EF7F8092C7EA3F0002EF91C7FC14EE14FE5CA45CA55CB3B3A480133F90B5FCB7
+12C0A5334B7ACA3D>114 D<DA1FFFEB038049B512E0010FECF807903A3FE001FE0F01FE
+C7EA1F9FD801F8EC07DFD807E0EC03FF484880498048C9127F48163F003E161F127E170F
+127C12FC1707A46C1603A27E7F6C7E7F6D92C7FCEA3FFC13FF6C13E06C13FF6C14F06CEC
+FF806C15F86C15FE013F6E7E010F15E0010381010081020F14FEDA007F7F1503DB003F13
+80040713C0040113E000E081177FEF3FF06C161F170FEF07F8A217037E1701A27EA37E18
+F07E17036D16E0A26D15076DED0FC06D168000FE161F017CED3F00486C157E6DEC01F826
+F80FC0EB07F026F003F8EB7FC00100B6C7FC48013F13FC02071380354D7CCB3E>I<1407
+A85CA65CA35CA35CA25CA25BA25B5B5B5B5B5B48B712FE120FB8FCA3D8000190C9FCB3B3
+A2EF01C0B0EF03806D7FA3027FEC0700815F6E6C130E021F141E6F131C6E6C5B6E6C13F8
+913901FF01F09139007FFFC0031F5BDB03FCC7FC326B7EE93D>I<02F8EE0F80D803FFEE
+3FFFB5030FB5FCA5C6EE000F013F1603011F82A2010F82B3B3A660A460A3601307606E15
+0E0103161E606E4B7F010116706D6C03F07F6FD903E013F86E6C4948EBFFF8DA1FE0EB1F
+00DA0FFE13FE0203B512F8DA007F13E0030790C7EBC0004D4C7ACA58>I<B600F0017FB5
+00F849B512FCA5000149C849C8003F13E026007FF8DB3FF8030F13004A031F705A013F4D
+ED03F8180F011F755A735E6D6C1507667315036D6C63A24E7E6D6C50C7FC85606D6C031C
+160E866FEC387F6D63866FEC703F027F62866FDAE01F1578023F1A70866F902601C00F15
+F0021F62866F90260380071401020F62866F90260700031403020762866F010E01011407
+020397C8FC866F496D5C6E190E053C1580DC8038027F131E6E191C057815C0DCC070023F
+133C037F183805F015E07048021F1378033F187004E116F092261FF1C0020F5BA204F316
+F892260FFB80913807F9C0A204FF16FD6F90C86CB45AA36F486F90C9FCA36F486F5AA36F
+48167CA24C163C047016386E4B7EC973>119 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 <stdlib.h>
+#endif
+#include <ctype.h>
+#include <stdio.h>
+#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 <<EOF
+#line 423 "configure"
+#include "confdefs.h"
+#include <assert.h>
+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 <<EOF
+#line 437 "configure"
+#include "confdefs.h"
+#include <assert.h>
+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
+#line 468 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+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 <<EOF
+#line 504 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char strcmp(); below.  */
+#include <assert.h>
+/* 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 <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/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 <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
+EOF
+cat >> $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 <<CEOF' >> $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 <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/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 <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
+EOF
+cat >> $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 <regexp> 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 <regexp> 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 <regexp> 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 <regexp>
+#	(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 <variable>=<value> 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<!\
+				\n    May be no procedure with name\
+				>$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<!} 3
+				    if {! [info exists szCurrentTarget]} {
+					setTarget iTarget {}
+				    }
+				    lappend lTests($iTarget) \
+					    [file join \
+					    $szCurrentTestDirectory \
+					    $arg]
+				    debug {    Appended test:\
+					    >[file join \
+					    $szCurrentTestDirectory \
+					    $arg]<!} 3
+ 				} elseif {[llength [set tests \
+ 					[locateFile $szFname $szDname]]] > 0} {
+ 				    foreach test $tests {
+ 					if {[file exists $test]} {
+ 					    # file should be a test
+ 					    debug {       is a test:\
+ 						    >$test<!!} 3
+ 					    if {! [info exists\
+ 						    szCurrentTarget]} {
+ 						setTarget iTarget {}
+ 					    }
+ 					    lappend lTests($iTarget) \
+ 						    $test$szCaseArgs
+ 					    debug {    Appended test:\
+ 						    >$test$szCaseArgs<!!} 2
+ 					} else {
+ 					    warning "Test >$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:
+	#    <variable>=<value>
+	#
+	constructor {args} {
+	    debug {Constructor for >$this< [info level] [info class]} 9
+	    foreach varval $args {
+		set varval [split $varval "="]
+		if {[llength $varval] != 2} {
+		    error "Missing <variable>=<value> 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]] \
+			    "<undefined>"] != 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
+	    # <testScript> ::= <szScriptName>?[test case ID]?=<argument list>
+	    # <argument list> ::= <argument> <argument list>
+	    # <argument> ::= <variable name> | <variable name>=<value>
+	    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] \
+		    "<undefined>"] != 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 "<errorInfo has not been defined>"
+    }
+
+    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, <empty>,\
+				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<!} 3
+		lappend testList [file join $szCurrentTestDirectory $szTest]
+	    } elseif {[llength [set tests \
+		    [locateFile $szFname $szDname]]] > 0} {
+		foreach test $tests {
+		    if {[file exists $test]} {
+			# file should be a test
+			debug {       is a test: >$test<!!} 3
+			lappend testList ${test}${szID}${szA}
+		    } else {
+			warning "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 <<EOF
+#line 537 "configure"
+#include "confdefs.h"
+#include <assert.h>
+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 <<EOF
+#line 551 "configure"
+#include "confdefs.h"
+#include <assert.h>
+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 <<EOF
+#line 585 "configure"
+#include "confdefs.h"
+main(){return(0);}
+EOF
+eval $ac_link
+if test -s conftest && (./conftest; exit) 2>/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
+#line 675 "configure"
+#include "confdefs.h"
+#include <tclInt.h>
+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 <<EOF
+#line 732 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#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 <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/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 <<EOF
+
+# 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%@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 <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
+EOF
+cat >> $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 <kevind@rahul.net>  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 <kevind@rahul.net>  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 <kevind@rahul.net>  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 <kevin@aimnet.com>  Tue, 30 Sep 1997 23:04:21 -0700
+
+dejagnu (1.3-6) unstable; urgency=low
+
+  * changed dependency to expect5.24
+
+ -- Kevin Dalley <kevin@aimnet.com>  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 <kevin@aimnet.com>  Sat, 12 Oct 1996 02:05:21 -0700
+
+    
+  
+
+Sun Jun  2 18:06:24 1996  Kevin Dalley  <kevin@aplysia.iway.aimnet.com (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  <kevin@aplysia.iway.aimnet.com (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  <kevin@aplysia.iway.aimnet.com (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  <kevin@aplysia.iway.aimnet.com (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 <kevind@rahul.net>
+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 <kevind@rahul.net>,
+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 <target>'.  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 <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/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 <<EOF
+
+# 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%@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 <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
+EOF
+cat >> $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 <<EOF
+
+EOF
+cat >> $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 @{<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) @}
+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{@{<return>@}} 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 @@
+<!DOCTYPE book PUBLIC "-//Davenport//DTD DocBook V3.0//EN" [
+
+<!-- Begin Document Specific Declarations -->
+
+<?Fm: Validation Off>
+
+<!ENTITY version "0.5">
+<!ENTITY dj "DejaGnu">
+
+<!ENTITY dejagnu-copyright "
+	<YEAR>1998</YEAR>
+	<HOLDER>Free Software Foundation, Inc.</HOLDER>">
+
+<!ENTITY dejagnu-code-copyright "
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+This file documents the GNU Testing Framework ``DejaGnu''
+
+Copyright (C) 92, 93, 94, 95, 96, 97, 98, 1999 Free Software Foundation, Inc.
+
+This text may be freely distributed under the terms of the GNU
+General Public License.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+">
+
+<!ENTITY dejagnu-copyright "
+Copyright 92, 93, 94, 95, 96, 97, 98, 1999 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.
+
+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.
+">
+
+<!-- The reference material -->
+<!entity ref SYSTEM "ref.sgml">
+
+<!-- The user manual -->
+<!entity user SYSTEM "user.sgml">
+
+<!-- End Document Specific Declarations -->
+]>
+
+<book>
+  <bookinfo>
+    <title>&dj;</title>
+    <subtitle>The GNU Testing Framework</subtitle>
+    <date>1998 Nov 24</date>
+    <edition> &version</edition>
+    <releaseinfo> for circulation within Cygnus</releaseinfo>
+    <authorgroup>
+      <author>
+        <firstname>Rob Savoye</firstname>
+        <affiliation>
+          <orgname>Free Software Foundation</orgname></affiliation>
+        <!-- <authorblurb>
+          <title>Rob Savoye</title>
+          <para>
+            His home page is at <ulink>
+            URL="http://www.welcomehome.org/rob.html">this
+            location</ulink>
+            </para>
+        </authorblurb>
+        -->
+      </author>
+    </authorgroup>
+    <address>
+      <email>rob@welcomehome.org</email>
+    </address>
+    <!-- &cygnus-street-address; -->
+    <copyright>&dejagnu-copyright;</copyright>
+    <!-- <legalnotice>
+      <para> -->
+        <!-- [FIXME: must put legal notice here] -->
+      <!-- </para> -->
+      <!-- &cygnus-legal-notice; -->
+    <!-- </legalnotice> -->
+    <revhistory>
+      <revision>
+        <revnumber> 0.1</revnumber>
+        <date>1998-11</date>
+        <authorinitials>rob@welcomehome.org</authorinitials>
+        <revremark>Initial version after conversion to DocBook.</revremark>
+      </revision>
+    </revhistory>
+
+  </bookinfo>
+
+  <toc></toc>
+
+  <preface id=preface>
+    <title>Abstract</title>
+
+    <para>This document attempts to describe the functionality of
+    DejaGnu, the GNU Testing Framework. DejaGnu is entirely written in
+    <productname>Expect</productname>, which uses
+    <productname>Tcl</productname> as a command
+    language. <productname>Expect</productname> 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; <command>expect</command> can also run any auxiliary
+    program, such as <command>diff</command> or <command>sh</command>,
+    with full control over its input and output.</para>  
+
+    <para>DejaGnu itself is merely a framework for creation of a test
+    suites. Test suites are distributed separately for each GNU
+    tool.</para>
+
+  </preface>
+
+  <chapter id=overview xreflabel=Overview>
+    <title>Overview</title>
+
+    <sect1 id=whatis xreflabel="What is &dj; ?">
+      <title>What is &dj; ?</title>
+
+    <para><productname>DejaGnu</productname> 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
+	<emphasis>Test Harness</emphasis> 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
+	<productname>Expect</productname>, which in turn uses
+	<productname>Tcl</productname> -- Tool command
+	language. There is more information on Tcl at the <ulink
+	URL="http://www.scriptics.com">Scriptics</ulink> web site, and the
+	Expect web site is at <ulink
+	URL="http://expect.nist.gov">NIST</ulink>.</para>
+
+	<para>DejaGnu offers several advantages for testing:</para>
+
+    <itemizedlist mark="bullet" spacing="compact">
+
+      <listitem><para>The flexibility and consistency of the DejaGnu
+	framework make it easy to write tests for any program, with
+	either batch oriented, or interactive programs.</para>
+      </listitem>
+
+      <listitem><para>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 <command>GDB</command> 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.</para>
+      </listitem>
+
+      <listitem><para>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.</para>
+      </listitem>
+
+      <listitem><para>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..</para>
+
+      </listitem>
+    </itemizedlist>
+
+    <para>Running tests requires two things: the testing framework, and
+    the test suites themselves. Tests are usually written in
+    <productname>Expect</productname> using Tcl, but you can also use a
+    Tcl script to run a test suite that is not based on
+    <productname>Expect</productname>.
+    (<productname>expect</productname> script filenames conventionally
+    use <emphasis>.exp</emphasis> as a suffix; for example, the main
+    implementation of the DejaGnu test driver is in the file
+    <productname>runtest.exp</productname>.)</para>
+	
+    <para>Julia Menapace first coined the term ``Deja Gnu'' to describe an
+    earlier testing framework at Cygnus Support she had written for
+    <command>GDB</command>. 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,<ulink
+    URL="mailto:deja@welcomehome.org">Deja Snow Savoye</ulink> (now 9
+    years old in Dec of 1998), who was a toddler during DejaGnu's
+    creation.</para>
+
+  </sect1>
+
+  <sect1 id=new xreflabel="Release Notes">
+    <title>What's New In This Release</title>
+  
+    <para>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
+    <productname>iTcl</productname> by the next release. Other changes
+    are:</para>
+
+    <itemizedlist>
+      <listitem><para>More builtin support for building target binaries
+        with the correct linker flags. Currently this only works with
+        <productname>GCC</productname> as the cross compiler,
+	preferably with a target supported by
+	<xref linkend=libgloss>.</para></listitem>
+
+      <listitem><para>Lots of little bug fixes from years of heavy
+        use at Cygnus Solutions.</para></listitem>
+
+      <listitem><para>DejaGnu now uses
+      <productname>Automake</productname> for Makefile
+      configuration.</para></listitem>
+
+      <listitem><para>Updated documentation, now in SGML
+	(using the <ulink
+	URL="http://nis-www.lanl.gov/~rosalia/mydocs/docbook-intro.html">free
+	GNU DocBook tools</ulink>) format.</para></listitem>
+	
+      <listitem><para>NT support. There is beta level support for NT
+      that is still a work in progress. This requires the <ulink
+      URL=httpd://sourceware.cygnus.com>Cygwin</ulink> POSIX system
+      for NT.</para></listitem>
+
+    </itemizedlist>
+
+    <sect2 id=cygwin xreflabel="NT Support">
+      <title>NT Support</title>
+  
+      <para>To use DejaGnu on NT, you need to first install the
+	<ulink URL="http://sourceware.cygnus.com">Cygwin</ulink>
+	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 <ulink
+	URL="http://sourceware.cygnus.com">this location</ulink>. This
+	works well enough to run <emphasis>"make check"</emphasis> 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...</para>
+
+    </sect2>
+	
+  </sect1>
+
+  <sect1 id=designgoals xreflabel="Design Goals">
+    <title>Design Goals</title>
+
+    <para>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:</para>
+
+    <itemizedlist mark="bullet">
+      <listitem><para>is useful to developers while fixing bugs.</para>
+      <listitem><para>automates running many tests during a software
+      release process.</para> 
+      <listitem><para>is portable among a variety of host
+      computers.</para> 
+      <listitem><para>supports cross-development testing.</para> 
+      <listitem><para>permits testing interactive programs, like
+      <command>GDB</command>; and </para>
+      <listitem><para>permits testing batch oriented programs, like
+      <command>GCC</command>.</para>
+    </itemizedlist>
+
+    <para>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 <command>GDB</command> works as well when cross-debugging
+    as it does in a native configuration. </para>
+
+    <para>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
+    <command>rsh</command>, <command>rlogin</command>,
+    <command>telnet</command>, <command>tip</command>, 
+    <command>kermit</command>, and <command>mondfe</command> for remote 
+    communications.</para>
+
+    </sect1>
+
+    <sect1 id=posix xreflabel="A POSIX Conforming Test Framework">
+      <title>A POSIX conforming test framework</title>
+
+      <para>DejaGnu conforms to the POSIX 1003.3 standard for test
+      frameworks. I was also a member of that committe.</para>
+
+      <para>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.</para>
+
+      <para>The POSIX documentation refers to <firstterm>assertions</firstterm>.
+      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.</para>
+
+      <para>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:</para>
+
+      <variablelist> 
+	<varlistentry>
+	  <term>PASS</term>
+	  <listitem><para>A test has succeeded.  That is, it demonstrated that
+	  the assertion is true.</para></listitem>
+	</varlistentry>
+ 
+        <varlistentry>
+	  <term>XFAIL</term>
+	  <listitem><para>POSIX 1003.3 does not incorporate the notion of
+	  expected failures, so <emphasis>PASS</emphasis>, instead of
+	  <emphasis>XPASS</emphasis>, must also be returned for test cases
+	  which were expected to fail and did not.  This means that
+	  <emphasis>PASS</emphasis> is in some sense more ambiguous than if
+	  <emphasis>XPASS</emphasis> is also used.</para></listitem>
+	</varlistentry>
+ 
+        <varlistentry>
+	  <term>FAIL</term>
+	  <listitem><para>A test has produced the bug it was intended to
+	  capture.  That is, it has demonstrated that the assertion is false.
+	  The <emphasis>FAIL</emphasis> message is based on the test case only.
+	  Other messages are used to indicate a failure of the framework. As
+	  with <emphasis>PASS</emphasis>, POSIX tests must return
+	  <emphasis>FAIL</emphasis> rather than <emphasis>XFAIL</emphasis> even
+	  if a failure was expected.</para></listitem>
+	</varlistentry>
+ 
+        <varlistentry>
+	  <term>UNRESOLVED</term>
+	  <listitem><para>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
+	  <emphasis>PASS</emphasis> or <emphasis>FAIL</emphasis> before a test
+	  run can be considered finished.</para>
+
+	  <para>Note that for POSIX, each assertion must produce a test result
+	  code.  If the test isn't actually run, it must produce
+	  <emphasis>UNRESOLVED</emphasis> 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
+	  <emphasis>return</emphasis>---if you alter the flow of control of the
+	  tcl code you must insure that every test still produces some result
+	  code.</para>
+
+	  <para>Here are some of the ways a test may wind up
+	  <emphasis>UNRESOLVED</emphasis>:</para>
+
+          <itemizedlist mark=bullet>
+	    <listitem><para>A test's execution is interrupted.</listitem>
+
+	    <listitem><para>A test does not produce a clear result. This is
+	    usually because there was an <emphasis>ERROR</emphasis> from
+	    DejaGnu while processing the test, or because there were three or
+	    more <emphasis>WARNING</emphasis> messages. Any 
+	    <emphasis>WARNING</emphasis> or <emphasis>ERROR</emphasis> 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.</para></listitem>
+
+	    <listitem><para>A test depends on a previous test, which
+	    fails.</para></listitem>
+
+	    <listitem><para>The test was set up incorrectly.</para></listitem>
+	  </itemizedlist>
+
+	  <varlistentry>	  
+	    <term>UNTESTED</term>
+	    <listitem><para>A test was not run.  This is a placeholder, used
+	    when there is no real test case yet.</para>
+	  </varlistentry>
+	</variablelist>
+
+	  <para>The only remaining output message left is intended to test
+	  features that are specified by the applicable POSIX standard as
+	  conditional:</para>
+
+	<variablelist>
+	  <varlistentry>	  
+  	    <term>UNSUPPORTED</term>
+	    <listitem><para>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 <emphasis>gethostname</emphasis>
+  	    would never work on a target board running only a boot monitor.
+	  </varlistentry>	  
+	</variablelist>
+  
+        <para>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 <emphasis>setup</emphasis>xfail} procedure as
+	described in the <emphasis>PASS</emphasis> section above, and you must
+	be careful to return <emphasis>UNRESOLVED</emphasis> where appropriate,
+	as described in the <emphasis>UNRESOLVED</emphasis> section
+	above.</para> 
+     </sect1>
+
+  </chapter>
+  
+  <!-- include the user manual -->
+  &user;
+
+  <!-- include the reference manual -->
+  &ref;
+
+</book>
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 @@
+<chapter id=reference>
+  <title>Reference</title>
+
+  <sect1 id=installation xreflabel="Installation">
+    <title>Installation</title>
+    
+    <para>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.</para>
+
+    <sect2 id=configuring xreflabel="Configuring DejaGnu">
+      <title>Configuring DejaGnu</title>
+
+      <para>It is usually best to configure in a directory separate from the
+      source tree, specifying where to find the source with the optional
+      <emphasis>--srcdir</emphasis> option to
+      <emphasis>configure</emphasis>. DejaGnu uses the GNU
+      <emphasis>autoconf</emphasis> to configure itself. For more info on using
+      autoconf, read the GNU autoconf manual. To configure, execute the
+      <filename>configure</filename> 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:</para>
+
+      <screen>
+        ../dejagnu-1.4/configure
+      </screen>
+
+      <para>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.</para>
+
+      <para>You may also want to use the <command>configure</command> option
+      <emphasis>--prefix</emphasis> to specify where you want DejaGnu and its
+      supporting code installed.  By default, installation is in subdirectories
+      of <filename>/usr/local</filename>, but you can select any alternate
+      directory <symbol>altdir</symbol> by including
+      <option>--prefix</option>{altdir}} on the
+      <command>configure</command> command line. (This value is captured in
+      the Makefile variables <emphasis>prefix</emphasis> and
+      <emphasis>exec</emphasis>prefix}.)</para>
+
+      <para>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 <emphasis>make check</emphasis> to build
+      auxiliary programs required by some of the tests, and run the test
+      suites.</para>
+
+    </sect2>
+    
+    <sect2 id=installing  xreflabel="Installing DejaGnu">
+      <title>Installing DejaGnu</title>
+
+      <para>To install DejaGnu in your filesystem (either in
+      <filename>/usr/local</filename>, or as specified by your
+      <emphasis>--prefix</emphasis> option to <emphasis>configure</emphasis>),
+      execute.</para>
+
+      <screen>
+        eg$ make install
+      </screen>
+
+      <para><emphasis>make install</emphasis>does thes things for
+      DejaGnu:</para>
+
+      <itemizedlist mark=bullet>
+        <listitem><para>Look in the path specified for executables
+          <symbol>$exec_prefix</symbol>) for directories called
+          <filename>lib</filename> and <filename>bin</filename>. If these
+          directories do not exist, <emphasis>make install</emphasis> creates
+          them.</para></listitem>
+
+        <listitem><para>Create another directory in the
+        <filename>share</filename> directory, called
+        <filename>dejagnu</filename>, and copy all the library files into
+        it.</listitem>
+
+        <listitem><para>Create a directory in the
+        <filename>dejagnu/share</filename> directory, called
+        <filename>config</filename>, and copy all the configuration files into
+        it.</listitem>
+
+	<listitem><para>Copy the <emphasis>runtest</emphasis> shell script into
+	<filename>$exec_prefix/bin</filename>.
+
+	<listitem><para>Copy <filename>runtest.exp</filename> into
+	<filename>$exec_prefix/lib/dejagnu</filename>. This is the main Tcl
+	code implementing DejaGnu.</para></listitem>
+
+      </itemizedlist>
+  </sect2>
+  </sect1>
+
+  <sect1 id=builtins xreflabel="Builtin Procedures">
+    <title>Builtin Procedures</title>
+
+    <para>DejaGnu provides these Tcl procedures.</para>
+
+    <sect2 id=coreprocs xreflabel="Core Internal Procedures">
+      <title>Core Internal Procedures</title>
+
+      <sect3 id=mailfile xreflabel="mail_file procedure">
+        <title>Mail_file Procedure</title>
+
+	<funcsynopsis role="tcl">
+            <funcdef><function>mail_file</function></funcdef>
+	    <paramdef><parameter>file to subject</parameter</paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter></parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+      <sect3 id=openlogs xreflabel="open_logs procedure">
+        <title>Open_logs Procedure</title>
+
+	<para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>open_logs</function></funcdef>
+	    <paramdef><parameter></parameter</paramdef>
+        </funcsynopsis>
+	</sect3>
+
+	<sect3 id=closelogs xreflabel="close_logs procedure">
+	  <title>Close_logs Procedure</title>
+
+	  <para></para>	
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>close_logs</function></funcdef>
+	    <paramdef><parameter></parameter</paramdef>
+        </funcsynopsis>
+	</sect3>
+
+	<sect3 id=isbuild xreflabel="isbuild procedure">
+	  <title>Isbuild Procedure</title>
+
+	  <para>Tests for a particular build host environment.  If the
+	  currently configured host matches the argument string, the result is
+	  <emphasis>1</emphasis>; otherwise the result is
+	  <emphasis>0</emphasis>.  <emphasis>host</emphasis> 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.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>isbuild</function></funcdef>
+	    <paramdef><parameter>pattern</parameter</paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>pattern</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=isremote xreflabel="is_remote procedure">
+	  <title>Is_remote Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>is_remote</function></funcdef>
+	    <paramdef><parameter>board</parameter</paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter></parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=is3way xreflabel="is3way procedure">
+	  <title>is3way Procedure</title>
+
+	  <para>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 <emphasis>1</emphasis>; otherwise the result is
+	  <emphasis>0</emphasis>.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>is3way</function></funcdef>
+	    <paramdef><parameter></parameter</paramdef>
+        </funcsynopsis>
+	</sect3>	
+
+	<sect3 id=ishost xreflabel="ishost procedure">
+	  <title>Ishost Procedure</title>
+
+	  <para>Tests for a particular host environment.  If the currently
+	  configured host matches the argument string, the result is
+	  <emphasis>1</emphasis>; otherwise the result is
+	  <emphasis>0</emphasis>. <emphasis>host</emphasis> 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).</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>ishost</function></funcdef>
+	    <paramdef><parameter>pattern</parameter></paramdef>
+	</funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter></parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=istarget xreflabel="istarget procedure">
+	  <title>Istarget Procedure</title>
+
+ 	  <para>Tests for a particular target environment.  If the currently
+	  configured target matches the argument string, the result is
+	  <emphasis>1</emphasis> ; otherwise the result is
+	  <emphasis>0</emphasis>.  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
+	  <emphasis>NULL</emphasis> string, then it returns the name of the
+	  build canonical configuration.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>istarget</function></funcdef>
+	    <paramdef><parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter></parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=isnative xreflabel="isnative procedure">
+	  <title>Isnative Procedure</title>
+
+	  <para>Tests whether the current configuration has the same host and
+	  target. When it runs in a native configuration this procedure returns
+	  a <emphasis>1</emphasis>; otherwise it returns a
+	  <emphasis>0</emphasis>.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>isnative</function></funcdef>
+	    <paramdef><parameter></parameter</paramdef>
+        </funcsynopsis>
+	</sect3>
+
+	<sect3 id=unknown xreflabel="unknown procedure">
+	  <title>Unknown Procedure</title>
+
+	  <para></para>	
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>unknown</function></funcdef>
+	    <paramdef><parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=cloneoutput xreflabel="clone_output procedure">
+	  <title>Clone_output Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>clone_output</function></funcdef>
+	    <paramdef><parameter>message</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>message</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=resetvars xreflabel="reset_vars procedure">
+	  <title>Reset_vars Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>reset_vars</function></funcdef>
+	    <paramdef><parameter></parameter</paramdef>
+        </funcsynopsis>
+	</sect3>	
+
+	<sect3 id=logandexit xreflabel="log_and_exit procedure">
+	  <title>Log_and_exit Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>log_and_exit</function></funcdef>
+	    <paramdef><parameter></parameter</paramdef>
+        </funcsynopsis>
+	</sect3>	
+
+	<sect3 id=logsummary xreflabel="log_summary procedure">
+	  <title>Log_summary Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+          <funcdef><function>log_summary</function></funcdef>
+	    <paramdef><parameter>args</parameter</paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>	
+
+	<sect3 id=cleanup xreflabel="cleanup procedure">
+	  <title>Cleanup Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>cleanup</function></funcdef>
+	    <paramdef><parameter></parameter</paramdef>
+        </funcsynopsis>
+	</sect3>
+
+	<sect3 id=setupxfail xreflabel="setup_xfail procedure">
+	  <title>Setup_xfail Procedure</title>
+
+	  <para>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
+	  <emphasis>bugid</emphasis> argument is optional, and used only in the
+	  logging file output; use it as a link to a bug-tracking system such
+	  as <productname>GNATS</productname>.</para>
+
+	  <para>Once you use <function>setup_xfail</function>, the
+	  <function>fail</function> and <function>pass</function> procedures
+	  produce the messages <emphasis>XFAIL</emphasis> and
+	  <emphasis>XPASS</emphasis> respectively, allowing you to distinguish
+	  expected failures (and unexpected success!) from other test
+	  outcomes.</para>
+
+	  <warning><para>Warning you must clear the expected failure after
+	  using setup_xfail in a test case.  Any call to <function>pass
+	  </function>or <function>fail</function>l clears the expected failure
+	  implicitly; if the test has some other outcome, e.g. an error, you
+	  can call <function>clear_xfail</function> to clear the expected
+	  failure explicitly.  Otherwise, the expected-failure declaration
+	  applies to whatever test runs next, leading to surprising
+	  results.</para></warning>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>setup_xfail</function></funcdef>
+	    <paramdef><parameter>config</parameter>
+	    <parameter>bugid</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>config</parameter></term>
+	    <listitem><para>The config triplet to trigger whether this is an
+	    unexpected or expect failure.</para></listitem>
+          </varlistentry>
+	  <varlistentry>
+	    <term><parameter>bugid</parameter></term>
+	    <listitem><para>The optional bugid, used to tie it this test case
+	    to a bug tracking system.</para></listitem>
+          </varlistentry>
+	</variablelist>
+      </sect3>
+
+	<sect3 id=recordtest xreflabel="record_test procedure">
+	  <title>Record_test Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>record_test</function></funcdef>
+	    <paramdef><parameter>type</parameter>
+		<parameter>message</parameter>
+		<parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>type</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>message</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=pass xreflabel="pass procedure">
+          <title>Pass Procedure</title>
+
+	  <para>Declares a test to have passed. <function>pass</function>
+	  writes in the log files a message beginning with
+	  <emphasis>PASS</emphasis> (or <emphasis>XPASS</emphasis>, if failure
+	  was expected), appending the argument
+	  <parameter>string</parameter>.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>pass</function></funcdef>
+	    <paramdef><parameter>string</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>string</parameter></term>
+	    <listitem><para>The string to use for this PASS
+	    message.</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=fail xreflabel="fail procedure">
+          <title>Fail Procedure</title>
+
+	  <para>Declares a test to have failed.  <function>fail</function>
+	  writes in the log files a message beginning with
+	  <emphasis>FAIL</emphasis> (or <emphasis>XFAIL</emphasis>, if failure
+	  was expected), appending the argument
+	  <parameter>string</parameter>.</para> 
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>fail</function></funcdef>
+	    <paramdef><parameter>string</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>string</parameter></term>
+	    <listitem><para>The string to use for this FAIL
+	    message.</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=xpass xreflabel="xpass procedure">
+          <title>Xpass Procedure</title>
+
+	  <para>Declares a test to have unexpectably passed, when it was
+	  expected to be a failure.  <function>xpass</function>
+	  writes in the log files a message beginning with
+	  <emphasis>XPASS</emphasis> (or <emphasis>XFAIL</emphasis>, if failure
+	  was expected), appending the argument
+	  <parameter>string</parameter>.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>xpass</function></funcdef>
+	    <paramdef><parameter>string</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>string</parameter></term>
+	    <listitem><para>The string to use for this output
+	    state.</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=xfail xreflabel="xfail procedure">
+          <title>Xfail Procedure</title>
+
+	  <para>Declares a test to have expectably
+	  failed. <function>xfail</function> 
+	  writes in the log files a message beginning with
+	  <emphasis>XFAIL</emphasis> (or <emphasis>PASS</emphasis>, if success
+	  was expected), appending the argument
+	  <parameter>string</parameter>.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>xpass</function></funcdef>
+	    <paramdef><parameter>string</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>string</parameter></term>
+	    <listitem><para>The string to use for this output
+	    state.</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=setwarningthreshold xreflabel="set_warning_threshold procedure">
+          <title>Set_warning_threshold Procedure</title>
+
+	  <para>Sets the value of <symbol>warning_threshold</symbol>. A value
+	  of <emphasis>0</emphasis> disables it: calls to
+	  <function>warning</function> will not turn a
+	  <emphasis>PASS</emphasis> or <emphasis>FAIL</emphasis> into an
+	  <emphasis>UNRESOLVED</emphasis>.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>set_warning_threshold</function></funcdef>
+	    <paramdef><parameter>threshold</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>threshold</parameter></term>
+	    <listitem><para>This is the value of the new warning
+	    threshold.</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=getwarningthreshold xreflabel="get_warning_threshold procedure">
+          <title>Get_warning_threshold Procedure</title>
+
+	  <para>Returns the current value of
+	  <symbol>{warning_threshold</symbol>. The default value is 3. This
+	  value controls how many <function>warning</function> procedures can
+	  be called before becoming <emphasis>UNRESOLVED</emphasis>.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>get_warning_threshold</function></funcdef>
+	    <paramdef><parameter></parameter></paramdef>
+        </funcsynopsis>
+
+      <sect3 id=warning xreflabel="warning procedure">
+        <title>Warning Procedure</title>
+
+	<para>Declares detection of a minor error in the test case
+	itself. <function>warning</function> writes in the log files a message
+	beginning with <emphasis>WARNING</emphasis>, appending the argument
+	<parameter>string</parameter>.  Use <function>warning</function> rather
+	than <function>perror</function> for cases (such as communication
+	failure to be followed by a retry) where the test case can recover from
+	the error. If the optional <parameter>number</parameter> is supplied,
+	then this is used to set the internal count of warnings to that
+	value.</para>
+
+	<para>As a side effect, <symbol>warning_threshold</symbol> or more
+	calls to warning in a single test case also changes the effect of the
+	next <function>pass</function> or <function>fail</function> command:
+	the test outcome becomes <emphasis>UNRESOLVED</emphasis> since an
+	automatic <emphasis>PASS</emphasis> or <emphasis>FAIL</emphasis> may
+	not be trustworthy after many warnings.  If the optional numeric value
+	is <emphasis>0</emphasis>, then there are no further side effects to
+	calling this function, and the following test outcome doesn't become
+	<emphasis>UNRESOLVED</emphasis>. This can be used for errors with no
+	known side effects.</para> 
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>warning</function></funcdef>
+	    <paramdef><parameter>string</parameter>
+	    <parameter>number</parameter>
+	    </paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>string</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>number</parameter></term>
+	    <listitem><para>The optional number to set the error counter. Thius
+	    is only used to fake out the counter when using the
+	    <function>xfail</function> procedure to control when it flips the
+	    output over to <emphasis>UNRESOLVED</emphasis>
+	    state.</para></listitem>
+          </varlistentry>
+	</variablelist>
+
+      <sect3 id=perror xreflabel="perror procedure">
+        <title>Perror Procedure</title>
+
+	<para>Declares a severe error in the testing framework
+	itself. <function>perror</function> writes in the log files a message
+	beginning with <emphasis>ERROR</emphasis>, appending the argument
+	<parameter>string</parameter>.</para>
+
+	<para>As a side effect, perror also changes the effect of the next
+	<function>pass</function> or <function>fail</function> command: the
+	test outcome becomes <emphasis>UNRESOLVED</emphasis>, since an
+	automatic <emphasis>PASS</emphasis> or <emphasis>FAIL</emphasis> cannot
+	be trusted after a severe error in the test framework.  If the optional
+	numeric value is <emphasis>0</emphasis>, then there are no further side
+	effects to calling this function, and the following test outcome
+	doesn't become <emphasis>UNRESOLVED</emphasis>. This can be used for
+	errors with no known side effects.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>perror</function></funcdef>
+	    <paramdef><parameter>string</parameter>
+	    <parameter>number</parameter>
+	    </paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>string</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>number</parameter></term>
+	    <listitem><para>The optional number to set the error counter. Thius
+	    is only used to fake out the counter when using the
+	    <function>xfail</function> procedure to control when it flips the
+	    output over to <emphasis>UNRESOLVED</emphasis>
+	    state.</para></listitem>
+          </varlistentry>
+	</variablelist>
+
+       <sect3 id=note xreflabel="note procedure">
+        <title>Note Procedure</title>
+
+	<para>Appends an informational message to the log
+	file. <function>note</function> writes in the log files a message
+	beginning with <emphasis>NOTE</emphasis>, appending the argument
+	<parameter>string</parameter>.  Use <function>note</function>
+	sparingly. The <function>verbose</function> 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 <function>note</function>.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>note</function></funcdef>
+	    <paramdef><parameter>string</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>string</parameter></term>
+	    <listitem><para>The string to use for this note.</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+       <sect3 id=untested xreflabel="untested procedure">
+        <title>Untested Procedure</title>
+
+	<para>Declares a test was not run. <function>untested</function> writes
+	in the log file a message beginning with <emphasis>UNTESTED</emphasis>,
+	appending the argument <emphasis>string</emphasis>. 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.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>untested</function></funcdef>
+	    <paramdef><parameter>string</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>string</parameter></term>
+	    <listitem><para>The string to use for this output
+	    state.</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+       <sect3 id=unresolved xreflabel="unresolved procedure">
+        <title>Unresolved Procedure</title>
+
+	<para>Declares a test to have an unresolved
+	outcome. <function>unresolved</function> writes in the log file a
+	message beginning with <emphasis>UNRESOLVED</emphasis>, appending the
+	argument <emphasis>string</emphasis>.  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).</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>unresolved</function></funcdef>
+	    <paramdef><parameter>string</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>string</parameter></term>
+	    <listitem><para>The string to use for this output
+	    state.</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+       <sect3 id=unsupported xreflabel="unsupported procedure">
+        <title>Unsupported Procedure</title>
+
+	<para>Declares that a test case depends on some facility that does not
+	exist in the testing environment. <function>unsupported</function>
+	writes in the log file a message beginning with
+	<emphasis>UNSUPPORTED</emphasis>, appending the argument string.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>unsupported</function></funcdef>
+	    <paramdef><parameter>string</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>string</parameter></term>
+	    <listitem><para>The string to use for this output
+	    state.</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=inittestcounts xreflabel="init_testcounts procedure">
+	  <title>Init_testcounts Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>init_testcounts</function></funcdef>
+	    <paramdef><parameter></parameter></paramdef>
+        </funcsynopsis>
+	</sect3>
+
+	<sect3 id=incrcount xreflabel="incr_count procedure">
+	  <title>Incr_count Procedure</title>
+
+	  <para></para>	
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>incr_count</function></funcdef>
+	    <paramdef><parameter>name</parameter>
+		<parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>name</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=transform xreflabel="transform procedure">
+	  <title>transform Procedure</title>
+
+	  <para>Generates a string for the name of a tool as it was configured
+	  and installed, given its native name (as the argument
+	  <parameter>toolname</parameter>). This makes the assumption that all
+	  tools are installed using the same naming conventions: For example,
+	  for a cross compiler supporting the <emphasis>m68k-vxworks</emphasis>
+	  configuration, the result of transform <command>gcc</command> is
+	  <command>m68k-vxworks-gcc</command>.</para> 
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>transform</function></funcdef>
+	    <paramdef><parameter>toolname</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>toolname</parameter></term>
+	    <listitem><para>The name of the cross-development program to
+	    transform.</para></listitem> 
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+
+	<sect3 id=checkconditionalxfail xreflabel="check_conditional_xfail procedure">
+	  <title>Check_conditional_xfail Procedure</title>
+
+	  <para>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 <emphasis>XFAIL</emphasis>. Otherwise it'll produce
+	  an ordinary <emphasis>FAIL</emphasis>. You can also specify flags to
+	  exclude. This makes a result be a <emphasis>FAIL</emphasis>, even if
+	  the included options are found. To set the conditional, set
+	  the variable <symbol>compiler_conditional_xfail_data</symbol> to the
+	  fields <programlisting>"[message string] [targets list] [includes
+	  list] [excludes list]"</programlisting> (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 <emphasis>1</emphasis> if the
+	  conditional is true, or <emphasis>0</emphasis> if the conditional is
+	  false.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>check_conditional_xfail</function></funcdef>
+	    <paramdef><parameter>message</parameter>
+	    <parameter>targets</parameter>
+	    <parameter>includes</parameter>
+	    <parameter>excludes</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>message</parameter></term>
+	    <listitem><para>This is the message to print with the normal test
+	    result.</para></listitem>
+          </varlistentry>
+         <varlistentry>
+	    <term><parameter>targets</parameter></term>
+	    <listitem><para>This is a string with the list targets to activate
+	    this conditional on.</para></listitem>
+          </varlistentry>
+         <varlistentry>
+	    <term><parameter>includes</parameter></term>
+	    <listitem><para>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.</para></listitem>
+          </varlistentry>
+         <varlistentry>
+	    <term><parameter>excludes</parameter></term>
+	    <listitem><para>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.</para></listitem> 
+          </varlistentry>
+	</variablelist>
+
+	<example>
+	  <title>Specifying the conditional xfail data</title>
+
+	  <programlisting>
+	  set compiler_conditional_xfail_data { \
+	       "I sure wish I knew why this was hosed" \
+               "sparc*-sun*-* *-pc-*-*" \
+               {"-Wall -v" "-O3"} \
+               {"-O1" "-Map"} \
+          }
+	  </programlisting>
+
+	  </example>
+
+	  <para>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.</para>
+
+	</sect3>
+
+	<sect3 id=clearxfail xreflabel="clear_xfail procedure">
+	  <title>Clear_xfail Procedure</title>
+
+	  <para>Cancel an expected failure (previously declared with
+	  <command>setup_xfail</command>) for a particular set of
+	  configurations.  The <parameter>config</parameter> argument is a list
+	  of configuration target names.  It is only necessary to call
+	  <command>clear_xfail</command> if a test case ends without calling
+	  either <command>pass</command> or <command>fail</command>, after
+	  calling <command>setup_xfail</command>.</para> 
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>clear_xfail</function></funcdef>
+	    <paramdef><parameter>config</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>config</parameter></term>
+ 	    <listitem><para>The configuration triplets to
+ 	    clear.</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=verbose xreflabel="verbose procedure">
+	  <title>Verbose Procedure</title>
+
+	  <para>Test cases can use this function to issue helpful messages
+	  depending on the number of <option>--verbose</option> options on the
+	  runtest command line.  It prints string if the value of the variable
+	  <symbol>verbose</symbol> is higher than or equal to the optional
+	  number. The default value for number is <emphasis>1</emphasis>.  Use
+	  the optional <option>-log</option> argument to cause string to always
+	  be added to the log file, even if it won't be printed.  Use the
+	  optional <option>-n</option> argument to print string without a
+	  trailing newline.  Use the optional <option>--</option> argument if
+	  string begins with "-".</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>verbose</function></funcdef>
+	    <paramdef><parameter>-log</parameter>
+	    <parameter>-n</parameter>
+	    <parameter>-r</parameter>
+	    <parameter>string</parameter>
+	    <parameter>number</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>-log</parameter></term>
+ 	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>-n</parameter></term>
+ 	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>--</parameter></term>
+ 	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>string</parameter></term>
+ 	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>number</parameter></term>
+ 	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=loadlib xreflabel="load_lib procedure">
+	  <title>Load_lib Procedure</title>
+
+	  <para>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
+	  <command>make install</command>, this path defaults to the current
+	  directory.  In either case, it then looks in the current directory
+	  for a directory called <filename>lib</filename>.  If there are
+	  duplicate definitions, the last one loaded takes precedence over the
+	  earlier ones.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>load_lib</function></funcdef>
+	    <paramdef><parameter>filespec</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>filespec</parameter></term>
+ 	    <listitem><para>The name of the DejaGnu library file to
+	    load.</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+    </sect2>
+
+    <sect2 id=remoteprocs>
+      <title>Procedures For Remote Communication</title>
+
+      <para><filename>lib/remote.exp</filename> 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 <emphasis>-1</emphasis>, when the
+	connection cannot be established, or the spawn ID returned by
+	the <productname>Expect</productname> command
+	<command>spawn</command>.</para>
+	
+	<para>It use the value of the <symbol>connect</symbol> field
+	in the <symbol>target_info</symbol> array (was
+	<symbol>connectmode</symbol> as the type of connection to
+	make. Current supported connection types are tip, kermit,
+	telnet, rsh, rlogin, and netdata. If the <option>--reboot</option>
+	option was used on the runtest command line, then the target
+	is rebooted before the connection is made.</para>
+
+	<sect3 id=callremote xreflabel="call_remote procedure">
+	  <title>Call_remote Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>call_remote</function></funcdef>
+	    <paramdef><parameter>type</parameter>
+		<parameter>proc</parameter>
+		<parameter>dest</parameter>
+		<parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+           <varlistentry>
+	     <term><parameter>proc</parameter></term>
+	     <listitem><para></para></listitem>
+           </varlistentry>
+           <varlistentry>
+	     <term><parameter>dest</parameter></term>
+	     <listitem><para></para></listitem>
+           </varlistentry>
+           <varlistentry>
+	     <term><parameter>args</parameter></term>
+	     <listitem><para></para></listitem>
+           </varlistentry>
+         </variablelist>
+	 </sect3>
+
+	 <sect3 id=checkforboardstatus xreflabel="check_for_board_status
+	 procedure">
+	   <title>Check_for_board_status Procedure</title>
+
+	   <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>check_for_board_status</function></funcdef>
+	    <paramdef><parameter>variable</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+             <varlistentry>
+	       <term><parameter>variable</parameter></term>
+	        <listitem><para></para></listitem>
+         </varlistentry>
+         </variablelist>
+	 </sect3>
+
+	 <sect3 id=fileonbuild xreflabel="file_on_build procedure">
+	   <title>File_on_build Procedure</title>
+
+	   <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>file_on_build</function></funcdef>
+	    <paramdef><parameter>op</parameter>
+		<parameter>file</parameter>
+		<parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+           <varlistentry>
+	     <term><parameter>op</parameter></term>
+	     <listitem><para></para></listitem>
+           </varlistentry>
+           <varlistentry>
+	     <term><parameter>file</parameter></term>
+	     <listitem><para></para></listitem>
+           </varlistentry>
+           <varlistentry>
+	     <term><parameter>args</parameter></term>
+	     <listitem><para></para></listitem>
+           </varlistentry>
+         </variablelist>
+	 </sect3>
+
+	 <sect3 id=fileonhost xreflabel="file_on_host procedure">
+	   <title>File_on_host Procedure</title>
+
+	   <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>file_on_host</function></funcdef>
+	    <paramdef><parameter>op</parameter>
+		<parameter>file</parameter>
+		<parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+           <varlistentry>
+	     <term><parameter>op</parameter></term>
+	     <listitem><para></para></listitem>
+           </varlistentry>
+           <varlistentry>
+	     <term><parameter>file</parameter></term>
+	     <listitem><para></para></listitem>
+           </varlistentry>
+           <varlistentry>
+	     <term><parameter>args</parameter></term>
+	     <listitem><para></para></listitem>
+           </varlistentry>
+         </variablelist>
+	 </sect3>
+
+	 <sect3 id=localexec xreflabel="local_exec procedure">
+	   <title>Local_exec Procedure</title>
+
+	   <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>local_exec</function></funcdef>
+	    <paramdef><parameter>commandline</parameter>
+		<parameter>inp</parameter>
+		<parameter>outp</parameter>
+		<parameter>timeout</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+           <varlistentry>
+	       <term><parameter>inp</parameter></term>
+	        <listitem><para></para></listitem>
+           </varlistentry>
+           <varlistentry>
+	       <term><parameter>outp</parameter></term>
+	        <listitem><para></para></listitem>
+           </varlistentry>
+           <varlistentry>
+	       <term><parameter>timeout</parameter></term>
+	        <listitem><para></para></listitem>
+           </varlistentry>
+         </variablelist>
+	 </sect3>
+
+	 <sect3 id=remotebinary xreflabel="remote_binary procedure">
+	   <title>Remote_binary Procedure</title>
+
+	   <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>remote_binary</function></funcdef>
+	    <paramdef><parameter>host</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	     <term><parameter>host</parameter></term>
+	     <listitem><para></para></listitem>
+           </varlistentry>
+         </variablelist>
+	 </sect3>
+
+	 <sect3 id=remoteclose xreflabel="remote_close procedure">
+	   <title>Remote_close Procedure</title>
+
+	   <para></para>	
+
+	  <funcsynopsis role="tcl"> 
+            <funcdef><function>remote_close</function></funcdef>
+	    <paramdef><parameter>shellid</parameter></paramdef>
+          </funcsynopsis>
+	  <variablelist>
+             <varlistentry>
+	       <term><parameter>shellid</parameter></term>
+	        <listitem><para>This is the value returned by a call
+	        to <function>remote_open</function>. This closes the
+	        connection to the target so resources can be used by
+	        others. This parameter can be left off if the
+	        <symbol>fileid</symbol> field in the
+	        <symbol>target_info</symbol> array is set.</para></listitem>
+           </varlistentry>
+         </variablelist>
+	 </sect3>
+
+	 <sect3 id=remotedownload xreflabel="remote_download procedure">
+	   <title>Remote_download Procedure</title>
+
+	   <para></para>
+
+	<funcsynopsis role="tcl"> 
+          <funcdef><function>remote_download</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>file</parameter>
+		<parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>file</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=remoteexec xreflabel="remote_exec procedure">
+	  <title>Remote_exec Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>remote_exec</function></funcdef>
+	    <paramdef><parameter>hostname</parameter>
+		<parameter>program</parameter>
+		<parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>hostname</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>program</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=remoteexpect xreflabel="remote_expect procedure">
+	  <title>Remote_expect Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>remote_expect</function></funcdef>
+	    <paramdef><parameter>board</parameter>
+		<parameter>timeout</parameter>
+		<parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>board</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>timeout</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=remotefile xreflabel="remote_file procedure">
+	  <title>Remote_file Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>remote_file</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>args</parameter</paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=remoteld xreflabel="remote_ld procedure">
+	  <title>Remote_ld Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>remote_ld</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>prog</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>prog</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=remoteload xreflabel="remote_load procedure">
+	  <title>Remote_load Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>remote_load</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>prog</parameter>
+		<parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>prog</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=remoteopen xreflabel="remote_open procedure">
+	  <title>Remote_open Procedure</title>
+
+	  <para></para>
+
+	  <funcsynopsis role="tcl"> 
+            <funcdef><function>remote_open</function></funcdef>
+	      <paramdef><parameter>type</parameter></paramdef>
+            </funcsynopsis>
+            <variablelist>
+              <varlistentry>
+		<term><parameter>type</parameter></term>
+	        <listitem><para>This is passed <option>host</option> or
+                <option>target</option>. 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
+	      <symbol>spawn_id</symbol> of the process that manages
+	      the connection. This value can be used in
+	      <productname>Expect</productname> or
+	      <command>exp_send</command> statements, or passed to
+	      other procedures that need the connection process's
+	      id. This also sets the <symbol>fileid</symbol> field in
+	      the <symbol>target_info</symbol> array.</para></listitem>
+         </varlistentry>
+         </variablelist>
+	 </sect3>
+
+	 <sect3 id=remotepopconn xreflabel="remote_pop_conn procedure">
+	   <title>Remote_pop_conn Procedure</title>
+
+	   <para></para>	
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>remote_pop_conn</function></funcdef>
+	    <paramdef><parameter>host</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>host</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=remotepushconn xreflabel="remote_push_conn procedure">
+	  <title>Remote_push_conn Procedure</title>
+
+	  <para></para>	
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>remote_push_conn</function></funcdef>
+	    <paramdef><parameter>host</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>host</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=remoterawbinary xreflabel="remote_raw_binary procedure">
+	  <title>Remote_raw_binary Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>remote_raw_binary</function></funcdef>
+	    <paramdef><parameter>host</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>host</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=remoterawclose xreflabel="remote_raw_close procedure">
+	  <title>Remote_raw_close Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>remote_raw_close</function></funcdef>
+	    <paramdef><parameter>host</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>host</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=remoterawfile xreflabel="remote_raw_file procedure">
+	  <title>Remote_raw_file Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>remote_raw_file</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=remoterawld xreflabel="remote_raw_ld procedure">
+	  <title>remote_raw_ld Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>remote_raw_ld</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>prog</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>prog</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=remoterawload xreflabel="remote_raw_load procedure">
+	  <title>Remote_raw_load Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>remote_raw_load</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>prog</parameter>
+		<parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>prog</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=remoterawopen xreflabel="remote_raw_open procedure">
+	  <title>Remote_raw_open Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>remote_raw_open</function></funcdef>
+	    <paramdef><parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=remoterawsend xreflabel="remote_raw_send procedure">
+	  <title>Remote_raw_send Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>remote_raw_send</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>string</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>string</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=remoterawspawn xreflabel="remote_raw_spawn procedure">
+	  <title>Remote_raw_spawn Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>remote_raw_spawn</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>commandline</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>commandline</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=remoterawtransmit xreflabel="remote_raw_transmit
+	procedure">
+	  <title>Remote_raw_transmit Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>remote_raw_transmit</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>file</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>file</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=remoterawwait xreflabel="remote_raw_wait procedure">
+	  <title>Remote_raw_wait Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>remote_raw_wait</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>timeout</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>timeout</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=remotereboot xreflabel="remote_reboot procedure">
+	  <title>Remote_reboot Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>remote_reboot</function></funcdef>
+	    <paramdef><parameter>host</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>host</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=remotesend xreflabel="remote_send procedure">
+	  <title>Remote_send Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>remote_send</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>string</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>string</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=remotespawn xreflabel="remote_spawn procedure">
+	  <title>Remote_spawn Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>remote_spawn</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>commandline</parameter>
+		<parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>commandline</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=remoteswapconn xreflabel="remote_swap_conn procedure">
+	  <title>Remote_swap_conn Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>remote_swap_conn</function></funcdef>
+	    <paramdef><parameter>host</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter></parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=remotetransmit xreflabel="remote_transmit procedure">
+	  <title>Remote_transmit Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>remote_transmit</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>file</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>file</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=remoteupload xreflabel="remote_upload procedure">
+	  <title>Remote_upload Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>remote_upload</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>srcfile</parameter>
+		<parameter>arg</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>srcfile</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>arg</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=remotewait xreflabel="remote_wait procedure">
+	  <title>Remote_wait Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>remote_wait</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>timeout</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>timeout</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=standardclose xreflabel="standard_close procedure">
+	  <title>Standard_close Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>standard_close</function></funcdef>
+	    <paramdef><parameter>host</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>host</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=standarddownload xreflabel="standard_download procedure">
+	  <title>Standard_download Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>standard_download</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>file</parameter>
+		<parameter>destfile</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>file</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>destfile</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=standardexec xreflabel="standard_exec procedure">
+	  <title>Standard_exec Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>standard_exec</function></funcdef>
+	    <paramdef><parameter>hostname</parameter>
+		<parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>hostname</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=standardfile xreflabel="standard_file procedure">
+	  <title>Standard_file Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>standard_file</function></funcdef>
+	    <paramdef><parameter>dest</parameter
+		<parameter>op</parameter
+		<parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter></parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=standardload xreflabel="standard_load procedure">
+	  <title>Standard_load Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>standard_load</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>prog</parameter>
+		<parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>prog</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=standardreboot xreflabel="standard_reboot procedure">
+	  <title>Standard_reboot Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>standard_reboot</function></funcdef>
+	    <paramdef><parameter>host</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>host</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=standardsend xreflabel="standard_send procedure">
+	  <title>Standard_send Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>standard_send</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>string</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>string</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=standardspawn xreflabel="standard_spawn procedure">
+	  <title>Standard_spawn Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>standard_spawn</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>commandline</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>commndline</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=standardtransmit xreflabel="standard_transmit procedure">
+	  <title>Standard_transmit Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>standard_transmit</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>file</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>file</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=standardupload xreflabel="standard_upload procedure">
+	  <title>Standard_upload Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>standard_upload</function></funcdef>
+	    <paramdef><parameter>dest srcfile destfile</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>srcfile</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>destfile</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=standardwait xreflabel="standard_wait procedure">
+	  <title>Standard_wait Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>standard_wait</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>timeout</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>timeout</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=unixcleanfilename xreflabel="unix_clean_filename
+	procedure">
+	  <title>Unix_clean_filename Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>unix_clean_filename</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>file</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>file</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+<!-- FIXME: this doesn't seem to exist anymore
+	<sect3 id=exitremoteshell xreflabel="exit_remote_shell procedure">
+	  <title>exit_remote_shell Procedure</title>
+
+	  <para></para>
+
+          <funcsynopsis role="tcl"> 
+            <funcdef><function>exit_remote_shell</function></funcdef>
+              <paramdef><parameter>spawnid</parameter></paramdef>
+            </funcsynopsis>
+            <variablelist>
+              <varlistentry>
+                <term><parameter>spawnid</parameter></term>
+                <listitem><para>Exits a remote process started by any
+                of the connection procedures. <symbol>spawnid</symbol>
+                is the result of the connection procedure that started
+                the remote process.</para></listitem>
+           </varlistentry>
+         </variablelist>
+	 </sect3>
+-->
+
+    </sect2>
+ 
+    <sect2 id=connprocs xreflabel="connprocs">
+      <title>Procedures For Using Utilities to Connect</title>
+
+      <para>telnet, rsh, tip, kermit</para>
+
+      <sect3 id=telnet xreflabel="telnet procedure">
+        <title>telnet Procedure</title>
+
+	<para></para>
+
+	  <funcsynopsis role="tcl">
+	    <funcdef><function>telnet</function></funcdef>
+	    <paramdef><parameter>hostname</parameter>
+	    <parameter>port</parameter></paramdef>
+          </funcsynopsis>
+          <funcsynopsis role="tcl">
+	    <funcdef><function>rlogin</function></funcdef>
+	    <paramdef><parameter>hostname</parameter></paramdef>
+          </funcsynopsis>
+	  </sect3>
+
+	  <sect3 id=rsh xreflabel="rsh procedure">
+	    <title>rsh Procedure</title>
+
+	    <para></para>
+
+          <funcsynopsis role="tcl">
+	    <funcdef><function>rsh</function></funcdef>
+	    <paramdef><parameter>hostname</parameter></paramdef>
+          </funcsynopsis>
+	  <variablelist>
+             <varlistentry>
+	       <term><parameter>hostname</parameter></term>
+	       <listitem><para>This refers to the IP address or name
+	        (for example, an entry in
+	        <filename>/etc/hosts</filename>) for this target. The
+	        procedure names reflect the Unix utility used to
+	        establish a connection. The optional
+	        <parameter>port</parameter> is used to specify the IP
+	        port number. The value of the
+	        <parameter>netport</parameter> field in the
+	        <symbol>target_info</symbol> array is used. (was
+	        <symbol>$netport</symbol>) This value has two parts,
+	        the hostname and the port number, seperated by a
+	        <emphasis>:</emphasis>. If host or target is used in
+	        the <symbol>hostname</symbol> field, than the
+	        config array is used for all information.</para></listitem>
+         </varlistentry>
+         </variablelist>
+	 </sect3>
+
+	 <sect3 id=tip xreflabel="tip procedure">
+	   <title>Tip Procedure</title>
+
+	   <para></para>
+
+	 <funcsynopsis role="tcl">
+           <funcdef><function>tip</function></funcdef>
+            <paramdef><parameter>port</parameter></paramdef>
+          </funcsynopsis>
+          <variablelist>
+             <varlistentry>
+               <term><parameter>port</parameter></term>
+               <listitem><para>Connect using the Unix utility
+               <command>tip</command>. <parameter>Port</parameter>must
+               be a name from the <productname>tip</productname>
+               configuration file
+               <filename>/etc/remote</filename>. Often, this is called
+               <symbol>hardwire</symbol>, or something like
+               <symbol>ttya</symbol>. This file holds all the
+               configuration data for the serial port. The value of
+               the <symbol>serial</symbol> field in the
+               <symbol>target_info</symbol> array is used. (was
+               <symbol>$serialport</symbol>) If <option>host</option>
+               or <option>target</option> is used in the
+               <parameter>port</parameter> field, than the config
+               array is used for all information. the
+	       config array is used for all information.</para></listitem>
+         </varlistentry>
+         </variablelist>
+	 </sect3>
+
+	 <sect3 id=kermit xreflabel="kermit procedure">
+	   <title>Kermit Procedure</title>
+
+	   <para></para>
+
+          <funcsynopsis role="tcl">
+            <funcdef><function>kermit</function></funcdef>
+            <paramdef><parameter>port</parameter>
+	    <parameter>bps</parameter></paramdef>
+          </funcsynopsis>
+          <variablelist>
+             <varlistentry>
+               <term><parameter>port</parameter></term>
+               <listitem><para>Connect using the program
+               <command>kermit</command>. <parameter>Port</parameter>
+               is the device name,
+               e.g. <filename>/dev/ttyb</filename>.
+	       </para></listitem>
+             </varlistentry>
+             <varlistentry>
+               <term><parameter>bps</parameter></term>
+               <listitem><para><parameter>bps</parameter> is the line
+               speed to use (in its per second) for the
+               connection. The value of the <symbol>serial</symbol>
+               field in the <symbol>target_info</symbol> array is
+               used.  (was <symbol>$serialport</symbol>) If
+               <option>host</option> or <option>target</option> is
+               used in the <parameter>port</parameter> field, than the
+               config array is used for all information. the
+	       config array is used for all information.</para></listitem>
+           </varlistentry>
+         </variablelist>
+	 </sect3>
+
+	 <sect3 id=kermitopen xreflabel="kermit_open procedure">
+	   <title>kermit_open Procedure</title>
+
+	   <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>kermit_open</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=kermitcommand xreflabel="kermit_command procedure">
+	  <title>Kermit_command Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>kermit_command</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=kermitsend xreflabel="kermit_send procedure">
+	  <title>Kermit_send Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>kermit_send</function></funcdef>
+	    <paramdef><parameter>dest string args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>string</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=kermittransmit xreflabel="kermit_transmit procedure">
+	  <title>Kermit_transmit Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>kermit_transmit</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>file</parameter>
+		<parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>file</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=telnetopen xreflabel="telnet_open procedure">
+	  <title>Telnet_open Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>telnet_open</function></funcdef>
+	    <paramdef><parameter>hostname</parameter>
+		<parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>hostname</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=telnetbinary xreflabel="telnet_binary procedure">
+	  <title>Telnet_binary Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>telnet_binary</function></funcdef>
+	    <paramdef><parameter>hostname</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>hostname</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=telnettransmit xreflabel="telnet_transmit procedure">
+	  <title>Telnet_transmit Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>telnet_transmit</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>file</parameter>
+		<parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>file</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=tipopen xreflabel="tip_open procedure">
+	  <title>Tip_open Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>tip_open</function></funcdef>
+	    <paramdef><parameter>hostname</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>hostname</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=rloginopen xreflabel="rlogin_open procedure">
+	  <title>Rlogin_open Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>rlogin_open</function></funcdef>
+	    <paramdef><parameter>arg</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>arg</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=rloginspawn xreflabel="rlogin_spawn procedure">
+	  <title>Rlogin_spawn Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>rlogin_spawn</function></funcdef>
+	    <paramdef><parameter>dest</parameter>
+		<parameter>cmdline</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>dest</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>cmdline</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=rshopen xreflabel="rsh_open procedure">
+	  <title>Rsh_open Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>rsh_open</function></funcdef>
+	    <paramdef><parameter>hostname</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>hostname</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=rshdownload xreflabel="rsh_download procedure">
+	  <title>Rsh_download Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>rsh_download</function></funcdef>
+	    <paramdef><parameter>desthost</parameter>
+		<parameter>srcfile</parameter>
+		<parameter>destfile</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>desthost</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>srcfile</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>destfile</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=rshupload xreflabel="rsh_upload procedure">
+	  <title>Rsh_upload Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>rsh_upload</function></funcdef>
+	    <paramdef><parameter>desthost</parameter>
+		<parameter>srcfile</parameter>
+		<parameter>destfile</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>desthost</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>srcfile</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>destfile</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=rshexec xreflabel="rsh_exec procedure">
+	  <title>Rsh_exec Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>rsh_exec</function></funcdef>
+	    <paramdef><parameter>boardname</parameter>
+		<parameter>cmd</parameter>
+		<parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>boardname</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>cmd</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=ftpopen xreflabel="ftp_open procedure">
+	  <title>Ftp_open Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>ftp_open</function></funcdef>
+	    <paramdef><parameter>host</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>host</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=ftpupload xreflabel="ftp_upload procedure">
+	  <title>Ftp_upload Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>ftp_upload</function></funcdef>
+	    <paramdef><parameter>host</parameter>
+		<parameter>remotefile</parameter>
+		<parameter>localfile</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>host</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>remotefile</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>localfile</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=ftpdownload xreflabel="ftp_download procedure">
+	  <title>Ftp_download Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>ftp_download</function></funcdef>
+	    <paramdef><parameter>host</parameter>
+		<parameter>localfile</parameter>
+		<parameter>remotefile</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>host</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>localfile</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>remotefile</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=ftpclose xreflabel="ftp_close procedure">
+	  <title>Ftp_close Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>ftp_close</function></funcdef>
+	    <paramdef><parameter>host</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>host</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=tipdownload xreflabel="tip_download procedure">
+	  <title>Tip_download Procedure</title>
+
+	  <para></para>
+
+          <funcsynopsis role="tcl"> 
+            <funcdef><function>tip_download</function></funcdef>
+              <paramdef><parameter>spawnid</parameter>
+              <parameter>file</parameter></paramdef>
+            </funcsynopsis>
+            <variablelist>
+              <varlistentry>
+                <term><parameter>spawnid</parameter></term>
+                <listitem><para>Download <option>file</option> to the
+                process <symbol>spawnid</symbol> (the value returned
+                when the connection was established), using the
+                <command>~put</command> command under
+                <productname>tip</productname>.  Most often used for
+                single board computers that require downloading
+                programs in ASCII S-records.  Returns
+                <emphasis>1</emphasis> if an error occurs,
+                <emphasis>0</emphasis> otherwise.</para></listitem>
+               </varlistentry>
+              <varlistentry>
+                 <term><parameter>file</parameter></term>
+                <listitem><para>This is the filename to
+                downlaod.</para></listitem>
+           </varlistentry>
+         </variablelist>
+       </sect3>
+    </sect2>
+
+    <sect2 id=targetprocs>
+      <title>Procedures For Target Boards</title>
+
+      <para></para>
+
+      <sect3 id=defaultlink xreflabel="default_link procedure">
+        <title>Default_link Procedure</title>
+
+	<para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>default_link</function></funcdef>
+	    <paramdef><parameter>board</parameter>
+	    <parameter>objects</parameter>
+	    <parameter>destfile</parameter>
+	    <parameter>flags</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>board</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>objects</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>destfile</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>flags</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=defaulttargetassemble xreflabel="default_target_assemble
+	procedure">
+	  <title>Default_target_assemble Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>default_target_assemble</function></funcdef>
+	    <paramdef><parameter>source</parameter>
+	    <parameter>destfile</parameter>
+	    <parameter>flags</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>source</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>destfile</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>flags</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=defaulttargetcompile xreflabel="default_target_compile
+	procedure">
+	  <title>default_target_compile Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>default_target_compile</function></funcdef>
+	    <paramdef><parameter>source</parameter>
+	    <parameter>destfile</parameter>
+	    <parameter>type</parameter>
+	    <parameter>options</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>source</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>destfile</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>type</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>options</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=popconfig xreflabel="pop_config procedure">
+	  <title>Pop_config Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>pop_config</function></funcdef>
+	    <paramdef><parameter>type</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>type</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=prunewarnings xreflabel="prune_warnings procedure">
+	  <title>Prune_warnings Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>prune_warnings</function></funcdef>
+	    <paramdef><parameter>text</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>text</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=pushbuild xreflabel="push_build procedure">
+	  <title>Push_build Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>push_build</function></funcdef>
+	    <paramdef><parameter>name</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>name</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=pushconfig xreflabel="push_config procedure">
+	  <title>push_config Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>push_config</function></funcdef>
+	    <paramdef><parameter>type</parameter>
+	    <parameter>name</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>type</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>name</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=reboottarget xreflabel="reboot_target procedure">
+	  <title>Reboot_target Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>reboot_target</function></funcdef>
+	    <paramdef><parameter></parameter></paramdef>
+        </funcsynopsis>
+	</sect3>
+
+	<sect3 id=targetassemble xreflabel="target_assemble procedure">
+	  <title>Target_assemble Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>target_assemble</function></funcdef>
+	    <paramdef><parameter>source destfile flags</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>source</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>destfile</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>flags</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=targetcompile xreflabel="target_compile procedure">
+	  <title>Target_compile Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>target_compile</function></funcdef>
+	    <paramdef><parameter>source</parameter>
+	    <parameter>destfile</parameter>
+	    <parameter>type</parameter>
+	    <parameter>options</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>source</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>destfile</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>type</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>options</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+	</sect2>
+
+	<sect2 id=targetdb xreflabel="target database library file ">
+	  <title>Target Database Procedures</title>
+
+	  <sect3 id=boardinfo xreflabel="board_info procedure">
+	    <title>Board_info Procedure</title>
+
+	    <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>board_info</function></funcdef>
+	    <paramdef><parameter>machine</parameter>
+	    <parameter>op</parameter>
+	    <parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>machine</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>op</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=hostinfo xreflabel="host_info procedure">
+	  <title>Host_info Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>host_info</function></funcdef>
+	    <paramdef><parameter>op</parameter>
+	    <parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>op</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=setboardinfo xreflabel="set_board_info procedure">
+	  <title>Set_board_info Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>set_board_info</function></funcdef>
+	    <paramdef><parameter>entry</parameter>
+	    <parameter>value</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>entry</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>value</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=setcurrtargetinfo xreflabel="set_currtarget_info
+	procedure">
+	  <title>Set_currtarget_info Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>set_currtarget_info</function></funcdef>
+	    <paramdef><parameter>entry</parameter>
+	    <parameter>value</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>entry</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>value</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=targetinfo xreflabel="target_info procedure">
+	  <title>Target_info Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>target_info</function></funcdef>
+	    <paramdef><parameter>op</parameter>
+	    <parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>op</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=unsetboardinfo xreflabel="unset_board_info procedure">
+	  <title>Unset_board_info Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>unset_board_info</function></funcdef>
+	    <paramdef><parameter>entry</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>entry</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=unsetcurrtargetinfo xreflabel="unset_currtarget_info
+	procedure">
+	  <title>Unset_currtarget_info Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>unset_currtarget_info</function></funcdef>
+	    <paramdef><parameter>entry</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>entry</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=pushtarget xreflabel="push_target procedure">
+	  <title>Push_target Procedure</title>
+
+	  <para>This makes the target named <emphasis>name</emphasis> be the
+	  current target connection. The value of <emphasis>name</emphasis> is
+	  an index into the <symbol>target_info</symbol> array and is set in
+	  the global config file.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>push_target</function></funcdef>
+	    <paramdef><parameter>name</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>name</parameter></term>
+	    <listitem><para>The name of the target to make current
+	    connection.</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=poptarget xreflabel="poptarget procedure">
+	  <title>Pop_target Procedure</title>
+
+	  <para>This unsets the current target connection.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>pop_target</function></funcdef>
+	    <paramdef><parameter></parameter></paramdef>
+        </funcsynopsis>
+	</sect3>
+
+	<sect3 id=listtargets xreflabel="list_targets procedure">
+	  <title>List_targets Procedure</title>
+
+	  <para>This lists all the supported targets for this
+	  architecture.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>list_targets</function></funcdef>
+	    <paramdef><parameter></parameter></paramdef>
+        </funcsynopsis>
+	</sect3>
+
+	<sect3 id=pushhost xreflabel="push_host	procedure">
+	  <title>Push_host Procedure</title>
+
+	  <para>This makes the host named <emphasis>name</emphasis> be the
+	  current remote host connection. The value of
+	  <emphasis>name</emphasis> is an index into the
+	  <symbol>target_info</symbol> array and is set in the global config
+	  file.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>push_host</function></funcdef>
+	    <paramdef><parameter>name</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>name</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=pophost xreflabel="pop_host procedure">
+	  <title>Pop_host Procedure</title>
+
+	  <para>This unsets the current host connection.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>pop_host</function></funcdef>
+	    <paramdef><parameter></parameter></paramdef>
+	 </funcsynopsis>
+	</sect3>
+
+	<sect3 id=compile xreflabel="compile procedure">
+	  <title>Compile Procedure</title>
+
+	  <para>This invokes the compiler as set by CC to compile the 
+	  file <filename>file</filename>. The default options for many cross
+	  compilation targets are <emphasis>guessed</emphasis> by DejaGnu, and
+	  these options can be added to by passing in more parameters as
+	  arguments to <command>compile</command>. Optionally, this will also
+	  use the value of the <emphasis>cflags</emphasis> 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
+	  <command>execute_anywhere</command>.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>compile</function></funcdef>
+	    <paramdef><parameter>file</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>file</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=archive xreflabel="archive procedure">
+	  <title>Archive Procedure</title>
+
+	  <para>This produces an archive file. Any parameters passed to
+	  <command>archive</command> are used in addition to the default
+	  flags. Optionally, this will also use the value of the
+	  <emphasis>arflags</emphasis> 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 <command>execute_anywhere</command>.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>archive</function></funcdef>
+	    <paramdef><parameter>file</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>file</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=ranlib xreflabel="ranlib procedure">
+	  <title>Ranlib Procedure</title>
+
+	  <para>This generates an index for the archive file for systems that
+	  aren't POSIX yet. Any parameters passed to <command>ranlib</command>
+	  are used in for the flags.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>ranlib</function></funcdef>
+	    <paramdef><parameter>file</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>file</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=executeanywhere xreflabel="execute_anywhere procedure">
+	  <title>Execute_anywhere Procedure</title>
+
+	  <para>This executes the <emphasis>cmdline</emphasis> on the proper
+	  host. This should be used as a replacement for the Tcl command
+	  <command>exec</command> 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.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>execute_anywhere</function></funcdef>
+	    <paramdef><parameter>cmdline</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>cmdline</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+    <sect2 id=platformprocs xreflabel="platform dependant procedures">
+      <title>Platform Dependant Procedures</title>
+
+      <para>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
+      <emphasis>_</emphasis>, and finally a suffix describing the
+      procedure's purpose.  For example, a procedure to extract the
+      version from <productname>GDB</productname> is called
+      <symbol>gdb_version</symbol>.</para>
+
+      <para><command>runtest</command> itself calls only two of these
+      procedures, <symbol>${tool}_exit</symbol> and
+      <symbol>${tool}_version</symbol>; these procedures use no
+      arguments.</para>
+
+      <para>The other two procedures, <symbol>${tool}_start</symbol>
+      and <symbol>${tool}_load</symbol>}, 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.</para>
+
+      <para>The usual convention for return codes from any of these
+      procedures (although it is not required by
+      <command>runtest</command>) is to return <emphasis>0</emphasis>
+      if the procedure succeeded, <emphasis>1</emphasis> if it failed,
+      and <emphasis>-1</emphasis> if there was a communication error.</para>
+	
+      	<sect3 id=toolstart xreflabel="${tool}_start procedure">
+	  <title>${tool}_start Procedure</title>
+
+	  <para>Starts a particular tool.  For an interactive tool,
+	  <function>${tool}_start</function> starts and initializes the
+	  tool, leaving the tool up and running for the test cases; an
+	  example is <function>gdb_start</function>, the start function
+	  for GDB. For a batch oriented tool,
+	  <function>${tool}_start</function> is optional; the recommended
+	  convention is to let <function>${tool}_start</function> run the
+	  tool, leaving the output in a variable called
+	  <function>comp_output</function>.  Test scripts can then analyze
+	  <function>$comp_output</function> to determine the test results.
+	  An example of this second kind of start function is
+	  <function>gcc_start</function>, the start function for GCC.</para>
+
+	  <para>DejaGnu itself does not call
+	  <function>${tool}_start</function>.  The initialization
+	  module <function>${tool}_init.exp</function> must call
+	  <function>${tool}_start</function> for interactive tools;
+	  for batch-oriented tools, each individual test script calls
+	  <function>${tool}_start</function> (or makes other
+	  arrangements to run the tool).</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>${tool}_start</function></funcdef>
+	    <paramdef><parameter></parameter></paramdef>
+        </funcsynopsis>
+	</sect3>
+
+	<sect3 id=toolload xreflabel="${tool}_load procedure">
+	  <title>${tool}_load Procedure</title>
+
+	  <para>Loads something into a tool. For an interactive tool,
+	  this conditions the tool for a particular test case; for
+	  example, <function>gdb_load</function> loads a new
+	  executable file into the debugger. For batch oriented tools,
+	  <function>${tool}_load</function> may do nothing---though,
+	  for example, the GCC support uses
+	  <function>gcc_load</function> to load and run a binary on
+	  the target environment.  Conventionally,
+	  <function>${tool}_load</function> leaves the output of any
+	  program it runs in a variable called
+	  <symbol>$exec_output</symbol>. Writing
+	  <function>${tool}_load</function> 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
+	  <function>${tool}_load</function>.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>${tool}_load</function></funcdef>
+	    <paramdef><parameter></parameter></paramdef>
+        </funcsynopsis>
+	</sect3>
+
+	<sect3 id=toolexit xreflabel="${tool}_exit procedure">
+	  <title>${tool}_exit Procedure</title>
+
+	  <para>Cleans up (if necessary) before DejaGnu exits. For
+	  interactive tools, this usually ends the interactive
+	  session.  You can also use <function>${tool}_exit</function>
+	  to remove any temporary files left over from the
+	  tests. <command>runtest</command> calls
+	  <function>${tool}_exit</function>.<para> 
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>${tool}_exit</function></funcdef>
+	    <paramdef><parameter></parameter></paramdef>
+        </funcsynopsis>
+	</sect3>
+
+	<sect3 id=toolversion xreflabel="${tool}_version procedure">
+	  <title>${tool}_version Procedure</title>
+
+	  <para>Prints the version label and number for
+	  <symbol>${tool}</symbol>.  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.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>${tool}_version</function></funcdef>
+	    <paramdef><parameter></parameter></paramdef>
+        </funcsynopsis>
+	</sect3>
+
+    </sect2>
+
+    <sect2 id=utilprocs>
+      <title>Utility Procedures</title>
+
+      <sect3 id=getdirs xreflabel="getdirs procedure">
+        <title>Getdirs Procedure</title>
+
+      <para>Returns a list of all the directories in the single
+	directory a single directory that match an optional
+	pattern. </para>
+	
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>getdirs</function></funcdef>
+	    <paramdef><parameter>rootdir</parameter>
+		<parameter>pattern</parameter></paramdef>
+	</funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>pattern</parameter></term>
+	    <listitem><para>If you do not specify
+	    <parameter>pattern</parameter>,
+	    <function>Getdirs</function> assumes a default pattern of
+	    <emphasis>*</emphasis>. You may use the common shell
+	    wildcard characters in the pattern. If no directories
+	    match the pattern, then a NULL string is
+	    returned</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+      <sect3 id=find xreflabel="find procedure">
+        <title>Find Procedure</title>
+
+	<para>Search for files whose names match <emphasis>pattern</emphasis>
+	(using shell wildcard characters for filename expansion).  Search
+	subdirectories recursively, starting at
+	<emphasis>rootdir</emphasis>. 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.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>find</function></funcdef>
+	    <paramdef><parameter>rootdir</parameter>
+	    <parameter>pattern</parameter></paramdef>
+	</funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>rootdir</parameter></term>
+	    <listitem><para>The top level directory to search the search
+	    from.</para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>pattern</parameter></term>
+	    <listitem><para>A csh "glob" style regular expression reprsenting
+	    the files to find.</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+        <sect3 id=which xreflabel="which procedure">
+        <title>Which Procedure</title>
+
+	<para>Searches the execution path for an executable file
+	<emphasis>binary</emphasis>, like the the BSD <command>which</command>
+	utility.  This procedure uses the shell environment variable
+	<emphasis>PATH</emphasis>. It returns <emphasis>0</emphasis> if the
+	binary is not in the path, or if there is no <emphasis>PATH</emphasis>
+	environment variable. If <command>binary</command> is in the path, it
+	returns the full path to <command>binary</command>.</para> 
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>which</function></funcdef>
+	    <paramdef><parameter>file</parameter></paramdef>
+	</funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>binary</parameter></term>
+	    <listitem><para>The executable program or shell script to look
+	    for.</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+        <sect3 id=grep xreflabel="grep procedure">
+        <title>Grep Procedure</title>
+
+	<para>Search the file called <filename>filename</filename> (a fully
+	specified path) for lines that contain a match for regular expression
+	<emphasis>regexp</emphasis>. The result is a list of all the lines that
+	match.  If no lines match, the result is an empty string.  Specify
+	<emphasis>regexp</emphasis> using the standard regular expression style
+	used by the Unix utility program grep.</para> 
+
+	<para>Use the optional third argument <emphasis>line</emphasis> to
+	start lines in the result with the line number in
+	<filename>filename</filename>.  (This argument is simply an option
+	flag; type it just as shown <option>--line</option>.)
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>grep</function></funcdef>
+	    <paramdef><parameter>filename</parameter>
+	    <parameter>regexp</parameter>
+	    <parameter>--line</parameter></paramdef>
+	</funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>filename</parameter></term>
+	    <listitem><para>The file to search.</para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>regexp</parameter></term>
+	    <listitem><para>The Unix style regular expression (as used by the
+	    <command>grep</command> Unix utility) to search
+	    for.</para></listitem> 
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>--line</parameter></term>
+	    <listitem><para>Prefix the line number to each line where the
+	    regexp matches.</para></listitem> 
+          </varlistentry>
+	</variablelist>
+
+	</sect3>
+	<sect3 id=prune xreflabel="prune procedure">
+	  <title>Prune Procedure</title>
+
+	  <para>Remove elements of the Tcl list <emphasis>list</emphasis>.
+	  Elements are fields delimited by spaces.  The result is a copy of
+	  list, without any elements that match <emphasis>pattern</emphasis>.
+	  You can use the common shell wildcard characters to specify the
+	  pattern.</para> 
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>prune</function></funcdef>
+	    <paramdef><parameter>list</parameter>
+  	    <parameter>pattern</parameter></paramdef>
+	</funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>list</parameter></term>
+	    <listitem><para>A Tcl list containing the original data. Commonly
+	    this is the output of a batch executed command, like running a
+	    compiler.</para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>pattern</parameter></term>
+	    <listitem><para>The csh shell "glob" style pattern to search
+	    for.</para></listitem>
+          </varlistentry>
+	</variablelist>
+
+	</sect3>
+
+	<sect3 id=slay xreflabel="slay procedure">
+	  <title>Slay Procedure</title>
+
+	  <para>This look in the process table for <emphasis>name</emphasis>
+	  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.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>slay</function></funcdef>
+	    <paramdef><parameter>name</parameter></paramdef>
+	</funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>name</parameter></term>
+	    <listitem><para>The name of the program to kill.</para></listitem>
+          </varlistentry>
+	</variablelist>
+
+	</sect3>
+
+	<sect3 id=absolute xreflabel="absolute procedure">
+	  <title>Absolute Procedure</title>
+
+	  <para>This procedure takes the relative <emphasis>path</emphasis>,
+	  and converts it to an absolute path.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>absolute</function></funcdef>
+	    <paramdef><parameter>path</parameter></paramdef>
+	</funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>path</parameter></term>
+	    <listitem><para>The path to convert.</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=psource xreflabel="psource procedure">
+	  <title>Psource Procedure</title>
+
+	  <para>This sources the file <emphasis>filename</emphasis>, and traps
+	  all errors. It also ignores all extraneous output. If there was an
+	  error it returns a <emphasis>1</emphasis>, otherwise it returns a
+	  <emphasis>0</emphasis>.
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>psource</function></funcdef>
+	    <paramdef><parameter>file</parameter></paramdef>
+	</funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>filename</parameter></term>
+	    <listitem><para>The filename to Tcl script to
+	    source.</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=runtestfilep xreflabel="runtest_file_p procedure">
+	  <title>Runtest_file_p Procedure</title>
+
+	  <para>Search <emphasis>runtest</emphasis>s for
+	  <emphasis>testcase</emphasis> and return <emphasis>1</emphasis> if
+	  found, <emphasis>0</emphasis> if not. <emphasis>runtests</emphasis>
+	  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 <emphasis>=</emphasis> if
+	  <programlisting>foo.exp="..."</programlisting>" 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.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>runtest_file_p</function></funcdef>
+	    <paramdef><parameter>runtests</parameter>
+	    <parameter>testcase</parameter></paramdef>
+	</funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>runtests</parameter></term>
+	    <listitem><para>The pathname of the testsuite expect script
+	    running</para></listitem> 
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>testcase</parameter></term>
+	    <listitem><para>The test case filename.</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=diff xreflabel="diff procedure">
+	  <title>Diff Procedure</title>
+
+	  <para>Compares the two files and returns a <emphasis>1</emphasis> if
+	  they match, or a <emphasis>0</emphasis> if they don't. If
+	  <symbol>verbose</symbol> is set, then it'll print the differences to
+	  the screen.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>diff</function></funcdef>
+	    <paramdef><parameter>file_1</parameter>
+	    <parameter>file_2</parameter></paramdef>
+	</funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>file_1</parameter></term>
+	    <listitem><para>The first file to compare.</para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>file_2</parameter></term>
+	    <listitem><para>The second file to compare.</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=setenv xreflabel="setenv procedure">
+	  <title>Setenv Procedure</title>
+
+	  <para>Sets the environment variable <emphasis>var</emphasis> to the
+	  value <emphasis>val</emphasis>.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>setenv</function></funcdef>
+	    <paramdef><parameter>var</parameter>
+   	    <parameter>val</parameter></paramdef>
+	 </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>var</parameter></term>
+	    <listitem><para>The environment variable to set.</para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>val</parameter></term>
+	    <listitem><para>The value to set the variable to.</para></listitem>
+          </varlistentry>
+	</variablelist>
+
+	<sect3 id=unsetenv xreflabel="unsetenv procedure">
+	  <title>unsetenv Procedure</title>
+
+	  <para>Unsets the environment variable
+	  <emphasis>var</emphasis>.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>unsetenv</function></funcdef>
+	    <paramdef><parameter>var</parameter></paramdef>
+	</funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>var</parameter></term>
+	    <listitem><para>The environment variable to
+	    unset.</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=getenv xreflabel="getenv procedure">
+	  <title>Getenv Procedure</title>
+
+	  <para>Returns the value of <emphasis>var</emphasis> in the
+	  environment if it exists, otherwise it returns NULL.
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>getenv</function></funcdef>
+	    <paramdef><parameter>var</parameter></paramdef>
+	</funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>var</parameter></term>
+	    <listitem><para>The environment variable to get the value
+	    of.</para></listitem>
+          </varlistentry>
+	</variablelist>
+
+	<sect3 id=prunesystemcrud xreflabel="prune_system_crud procedure">
+	  <title>Prune_system_crud Procedure</title>
+
+	  <para>For system <emphasis>system</emphasis>, delete text the host or
+	  target operating system might issue that will interfere with pattern
+	  matching of program output in <emphasis>text</emphasis>.  An example
+	  is the message that is printed if a shared library is out of
+	  date.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>prune_system_crud</function></funcdef>
+	    <paramdef><parameter>system</parameter>
+	    <parameter>test</parameter></paramdef>
+	</funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>system</parameter></term>
+	    <listitem><para>The system error messages to look for to screen out
+	   .</para></listitem>
+          </varlistentry>
+          <varlistentry>
+	    <term><parameter>text</parameter></term>
+	    <listitem><para>The Tcl variable containing the
+	    text.</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+	
+    </sect2>
+
+    <sect2 id=libgloss xreflabel="Libgloss">
+      <title>Libgloss, A Free BSP</title>
+
+      <para>Libgloss is a free <firstterm>BSP</firstterm> (Board Support
+      Package) commonly used with GCC and G++ to produce a fully linked
+      executable image for an embedded systems.</para>
+
+      <sect3 id=libglosslinkflags xreflabel="libgloss_link_flags procedure">
+        <title>Libgloss_link_flags Procedure</title>
+
+	<para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>libgloss_link_flags</function></funcdef>
+	    <paramdef><parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=libglossincludeflags xreflabel="libgloss_include_flags
+	procedure">
+	  <title>Libgloss_include_flags Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>libgloss_include_flags</function></funcdef>
+	    <paramdef><parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=newliblinkflags xreflabel="newlib_link_flags procedure">
+	  <title>Newlib_link_flags Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>newlib_link_flags</function></funcdef>
+	    <paramdef><parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=newlibincludeflags xreflabel="newlib_include_flags
+	procedure">
+	  <title>Newlib_include_flags Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>newlib_include_flags</function></funcdef>
+	    <paramdef><parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=libioincludeflags xreflabel="libio_include_flags
+	procedure">
+	  <title>Libio_include_flags Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>libio_include_flags</function></funcdef>
+	    <paramdef><parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=libiolinkflags xreflabel="libio_link_flags procedure">
+	  <title>Libio_link_flags Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>libio_link_flags</function></funcdef>
+	    <paramdef><parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=gxxincludeflags xreflabel="g++_include_flags procedure">
+	  <title>G++_include_flags Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>g++_include_flags</function></funcdef>
+	    <paramdef><parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=gxxlinkflags xreflabel="g++_link_flags procedure">
+	  <title>G++_link_flags Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>g++_link_flags</function></funcdef>
+	    <paramdef><parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=libstdcxxincludeflags xreflabel="libstdc++_include_flags
+	procedure">
+	  <title>Libstdc++_include_flags Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>libstdc++_include_flags</function></funcdef>
+	    <paramdef><parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=libstdcxxlinkflags xreflabel="libstdc++_link_flags
+	procedure">
+	  <title>Libstdc++_link_flags Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>libstdc++_link_flags</function></funcdef>
+	    <paramdef><parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=getmultilibs xreflabel="get_multilibs procedure">
+	  <title>Get_multilibs Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>get_multilibs</function></funcdef>
+	    <paramdef><parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=findbinutilsprog xreflabel="find_binutils_prog procedure">
+	  <title>Find_binutils_prog Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>find_binutils_prog</function></funcdef>
+	    <paramdef><parameter>name</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>name</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=findgcc xreflabel="find_gcc procedure">
+	  <title>Find_gcc Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>find_gcc</function></funcdef>
+	    <paramdef><parameter></parameter></paramdef>
+        </funcsynopsis>
+	</sect3>
+
+	<sect3 id=findgcj xreflabel="find_gcj procedure">
+	  <title>Find_gcj Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>find_gcj</function></funcdef>
+	    <paramdef><parameter></parameter></paramdef>
+        </funcsynopsis>
+	</sect3>
+
+	<sect3 id=findgxx xreflabel="find_g++ procedure">
+	  <title>Find_g++ Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>find_g++</function></funcdef>
+	    <paramdef><parameter></parameter></paramdef>
+        </funcsynopsis>
+	</sect3>
+
+	<sect3 id=findg77 xreflabel="find_g77 procedure">
+	  <title>Find_g77 Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>find_g77</function></funcdef>
+	    <paramdef><parameter></parameter></paramdef>
+        </funcsynopsis>
+	</sect3>
+
+	<sect3 id=processmultiliboptions xreflabel="process_multilib_options
+	procedure">
+	  <title>Process_multilib_options Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>process_multilib_options</function></funcdef>
+	    <paramdef><parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=addmultiliboption xreflabel="add_multilib_option
+	procedure">
+	  <title>Add_multilib_option Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>add_multilib_option</function></funcdef>
+	    <paramdef><parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=findgas xreflabel="find_gas procedure">
+	  <title>Find_gas Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>find_gas</function></funcdef>
+	    <paramdef><parameter></parameter></paramdef>
+        </funcsynopsis>
+	</sect3>
+
+	<sect3 id=findld xreflabel="find_ld procedure">
+	  <title>Find_ld Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>find_ld</function></funcdef>
+	    <paramdef><parameter></parameter></paramdef>
+        </funcsynopsis>
+	</sect3>
+
+	<sect3 id=buildwrapper xreflabel="build_wrapper procedure">
+	  <title>Build_wrapper Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>build_wrapper</function></funcdef>
+	    <paramdef><parameter>gluefile</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>gluefile</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=winsupincludeflags xreflabel="winsup_include_flags
+	procedure">
+	  <title>Winsup_include_flags Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>winsup_include_flags</function></funcdef>
+	    <paramdef><parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=winsuplinkflags xreflabel="winsup_link_flags procedure">
+	  <title>Winsup_link_flags Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>winsup_link_flags</function></funcdef>
+	    <paramdef><parameter>args</parameter></paramdef>
+        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+    </sect2>
+
+    <sect2 id=debugprocs xreflabel="Debugging Procedures">
+      <title>Procedures for debugging your Tcl code.</title>
+
+      <para><filename>lib/debugger.exp</filename>defines these utility
+      procedures:</para>
+
+      <sect3 id=dumpvars xreflabel="dumpvars procedure">
+        <title>Dumpvars Procedure</title>
+
+	<para>This takes a csh style regular expression (glob rules) and prints
+	the values of the global variable names that match.  It is abbreviated
+	as <emphasis>dv</emphasis>.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>dumpvars</function></funcdef>
+	    <paramdef><parameter>vars</parameter></paramdef>
+	        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>vars</parameter></term>
+	    <listitem><para>The variables to dump.</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=dumplocals xreflabel="dumplocals procedure">
+	  <title>Dumplocals Procedure</title>
+
+	  <para>This takes a csh style regular expression (glob rules) and
+	  prints the values of the local variable names that match. It is
+	  abbreviated as <emphasis>dl</emphasis>.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>dumplocals</function></funcdef>
+	    <paramdef><parameter>args</parameter></paramdef>
+	        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=dumprocs xreflabel="dumprocs procedure">
+	  <title>Dumprocs Procedure</title>
+
+	  <para>This takes a csh style regular expression (glob rules) and
+	  prints the body of all procs that match. It is abbreviated as
+	  <emphasis>dp</emphasis>.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>dumprocs</function></funcdef>
+	    <paramdef><parameter>pattern</parameter></paramdef>
+	        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>pattern</parameter></term>
+	    <listitem><para>The csh "glob" style pattern to look
+	    for.</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=dumpwatch xreflabel="dumpwatch procedure">
+	  <title>Dumpwatch Procedure</title>
+
+	  <para>This takes a csh style regular expression (glob rules) and
+	  prints all the watchpoints. It is abbreviated as
+	  <emphasis>dw</emphasis>.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>dumpwatch</function></funcdef>
+	    <paramdef><parameter>pattern</parameter></paramdef>
+	        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>pattern</parameter></term>
+	    <listitem><para>The csh "glob" style pattern to look
+	    for.</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=watcharray xreflabel="watcharray procedure">
+	  <title>Watcharray Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>watcharray</function></funcdef>
+	    <paramdef><parameter>element</parameter>
+		<parameter>type</parameter></paramdef>
+	        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>type</parameter></term>
+	    <listitem><para>The csh "glob" style pattern to look
+	    for.</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=watchvar xreflabel="watchvar procedure">
+	  <title>Watchvar Procedure</title>
+
+	  <para></para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>watchvar</function></funcdef>
+	    <paramdef><parameter>var</parameter>
+		<parameter>type</parameter></paramdef>
+	        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter></parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=watchunset xreflabel="watchunset procedure">
+	  <title>Watchunset Procedure</title>
+
+	  <para>This breaks program execution when the variable
+	  <symbol>var</symbol> is unset. It is abbreviated as
+	  <emphasis>wu</emphasis>.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>watchunset</function></funcdef>
+	    <paramdef><parameter>arg</parameter></paramdef>
+	        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=watchwrite xreflabel="watchwrite procedure">
+	  <title>Watchwrite Procedure</title>
+
+	  <para>This breaks program execution when the variable
+	  <symbol>var</symbol> is written. It is abbreviated as
+	  <emphasis>ww</emphasis>.</para> 
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>watchwrite</function></funcdef>
+	    <paramdef><parameter>var</parameter></paramdef>
+	        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>var</parameter></term>
+	    <listitem><para>The variable to watch.</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>	
+
+	<sect3 id=watchread xreflabel="watchread procedure">
+	  <title>Watchread Procedure</title>
+
+	  <para>This breaks program execution when the variable
+	  <symbol>var</symbol> is read. It is abbreviated as
+	  <emphasis>wr</emphasis>.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>watchread</function></funcdef>
+	    <paramdef><parameter>var</parameter></paramdef>
+	        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>var</parameter></term>
+	    <listitem><para>The variable to watch.</para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=watchdel xreflabel="watchdel procedure">
+	  <title>Watchdel Procedure</title>
+
+	  <para>This deletes a the watchpoint from the watch list. It is
+	  abbreviated as <emphasis>wd</emphasis>.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>watchdel</function></funcdef>
+	    <paramdef><parameter>args</parameter></paramdef>
+	        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>args</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=print xreflabel="print procedure">
+	  <title>Print Procedure</title>
+
+	  <para>This prints the value of the variable
+	  <parameter>var</parameter>. It is abbreviated as
+	  <emphasis>p</emphasis>.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>print</function></funcdef>
+	    <paramdef><parameter>var</parameter></paramdef>
+	        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter>var</parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+	<sect3 id=quit xreflabel="quit procedure">
+	  <title>Quit Procedure</title>
+
+	  <para>This makes runtest exit. It is abbreviated as
+	  <emphasis>q</emphasis>.</para>
+
+	<funcsynopsis role="tcl"> 
+            <funcdef><function>quit</function></funcdef>
+	    <paramdef><parameter></parameter></paramdef>
+	        </funcsynopsis>
+	<variablelist>
+          <varlistentry>
+	    <term><parameter></parameter></term>
+	    <listitem><para></para></listitem>
+          </varlistentry>
+	</variablelist>
+	</sect3>
+
+    </sect2>
+
+  </sect1>
+
+   <sect1 id=filemap>
+    <title>File Map</title>
+
+    <para>This is a map of the files in DejaGnu.</para>
+
+    <itemizedlist>
+      <listitem><para>runtest</para></listitem>
+      <listitem><para>runtest.exp</para></listitem>
+      <listitem><para>stub-loader.c</para></listitem>
+      <listitem><para>testglue.c</para></listitem>
+      <listitem><para>config</para></listitem>
+      <listitem><para>baseboards</para></listitem>
+      <listitem><para>lib/debugger.exp</para></listitem>
+      <listitem><para>lib/dg.exp</para></listitem>
+      <listitem><para>lib/framework.exp</para></listitem>
+      <listitem><para>lib/ftp.exp</para></listitem>
+      <listitem><para>lib/kermit.exp</para></listitem>
+      <listitem><para>lib/libgloss.exp</para></listitem>
+      <listitem><para>lib/mondfe.exp</para></listitem>
+      <listitem><para>lib/remote.exp</para></listitem>
+      <listitem><para>lib/rlogin.exp</para></listitem>
+      <listitem><para>lib/rsh.exp</para></listitem>
+      <listitem><para>lib/standard.exp</para></listitem>
+      <listitem><para>lib/target.exp</para></listitem>
+      <listitem><para>lib/targetdb.exp</para></listitem>
+      <listitem><para>lib/telnet.exp</para></listitem>
+      <listitem><para>lib/tip.exp</para></listitem>
+      <listitem><para>lib/util-defs.exp</para></listitem>
+      <listitem><para>lib/utils.exp</para></listitem>
+      <listitem><para>lib/xsh.exp</para></listitem>
+    </itemizedlist>
+
+  </sect1>
+
+</chapter>
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 @@
+  <chapter id=runningtests>
+    <title>Running Tests</title>
+
+    <para>There are two ways to execute a test suite. The most
+    common way is when there is existing support in the
+    <filename>Makefile</filename>. This support consists of a
+    <emphasis>check</emphasis> target. The other way is to execute the
+    <command>runtest</command> program directly. To run
+    <command>runtest</command> directcly from the command line requires
+    either all the correct options, or the <xref linkend=local> must be setup
+    correctly.</para>
+
+    <sect1 id=makecheck xreflabel="Make Check">
+      <title>Make check</title>
+
+      <para>To run tests from an existing collection, first use
+      <command>configure</command> as usual to set up the
+      build directory. Then try typing:</para>
+
+      <screen>
+      make check
+      </screen>
+
+      <para>If the <emphasis>check</emphasis> 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
+      <emphasis>site.exp</emphasis>. 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.</para>
+
+      <para>The <emphasis>check</emphasis> target is supported by GNU
+      <productname>Automake</productname>. To have DejaGnu support added to your
+      generated <filename>Makefile.in</filename>, just add the keyword
+      dejagnu to the AUTOMAKE_OPTIONS variable in your
+      <filename>Makefile.am</filename> file.</para>
+
+      <para>Once you have run <emphasis>make check</emphasis> to build
+      any auxiliary files, you can invoke the test driver
+      <command>runtest</command> directly to repeat the tests.
+      You will also have to execute <command>runtest</command>
+      directly for test collections with no
+      <emphasis>check</emphasis> target in the
+      <filename>Makefile</filename>.</para>
+
+    </sect1>
+    
+    <sect1 id=runtest xreflabel="Runtest">
+      <title>Runtest</title>
+
+      <para><command>runtest</command> is the executable test driver
+      for DejaGnu. You can specify two kinds of things on the
+      <command>runtest</command> command line: command line options,
+      and Tcl variables for the test scripts. The options are listed
+      alphabetically below.</para>
+
+      <para><command>runtest</command> returns an exit code of
+      <emphasis>1</emphasis> if any test has an unexpected result; otherwise
+      (if all tests pass or fail as expected) it returns <emphasis>0</emphasis>
+      as the exit code.</para>
+
+      <sect2 id=outputs xreflabel="Output States">
+        <title>Output States</title>
+
+	<para><filename>runtest</filename> flags the outcome of each
+	test as one of these cases. <xref linkend=posix> for a
+	discussion of how POSIX specifies the meanings of these
+	cases.</para>
+
+        <variablelist>
+        <varlistentry>
+          <term>PASS</term>
+          <listitem><para>The most desirable outcome: the test succeeded, and
+          was expected to succeed.</para></listitem>
+	</varlistentry>
+
+	<varlistentry>
+	  <term>XPASS</term>
+          <listitem><para>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.</para></listitem>
+	</varlistentry>
+ 
+	<varlistentry>
+	  <term>FAIL</term>
+          <listitem><para>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.</para></listitem>
+	</varlistentry>
+ 
+	<varlistentry>
+	  <term>XFAIL</term>
+          <listitem><para>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 <emphasis>UNSUPPORTED</emphasis>
+          instead.</para></listitem>
+	</varlistentry>
+ 
+	<varlistentry>
+	  <term>UNRESOLVED</term>
+          <listitem><para>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.</para></listitem>
+	</varlistentry>
+ 
+	<varlistentry>
+	  <term>UNTESTED</term>
+          <listitem><para>A test case is not yet complete, and in particular
+          cannot yet produce a <emphasis>PASS</emphasis> or
+          <emphasis>FAIL</emphasis>. You can also use this outcome in dummy
+          ``tests'' that note explicitly the absence of a real test case for a
+          particular property.</para></listitem>
+	</varlistentry>
+ 
+	<varlistentry>
+	  <term>UNSUPPORTED</term>
+          <listitem><para>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.</para></listitem>
+	</varlistentry>
+      </variablelist>
+
+      <para>runtest may also display the following messages:</para>
+
+      <variablelist>
+        <varlistentry>
+          <term>ERROR</term>
+          <listitem><para>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
+          <emphasis>UNSUPPORTED</emphasis>, <emphasis>UNTESTED</emphasis>, or
+          <emphasis>UNRESOLVED</emphasis> instead, as
+          appropriate.)</para></listitem>
+	</varlistentry>
+
+        <varlistentry>
+          <term>WARNING</term>
+          <listitem><para>Indicates a possible problem in running the
+          test. Usually warnings correspond to recoverable errors, or display
+          an important message about the following tests.</para></listitem>
+	</varlistentry>
+
+        <varlistentry>
+        <term>NOTE</term>
+        <listitem><para>An informational message about the test
+        case.</para></listitem>
+	</varlistentry>
+      </variablelist>
+
+    </sect2>
+
+    <sect2 id=invoking xreflabel="Invoking Runtest">
+      <title>Invoking Runtest</title>
+
+      <para>This is the full set of command line options that
+      <filename>runtest</filename> recognizes. Arguments may be
+      abbreviated to the shortest unique string.</para>
+
+      <variablelist>
+        <varlistentry>
+          <term><option>--all</option> (-a)</term>
+	  <listitem><para>Display all test output. By default,
+	  <emphasis>runtest</emphasis> shows only the output of tests that
+	  produce unexpected results; that is, tests with status
+	  <emphasis>FAIL</emphasis> (unexpected failure),
+	  <emphasis>XPASS</emphasis> (unexpected success), or
+	  <emphasis>ERROR</emphasis> (a severe error in the test case
+	  itself). Specify <emphasis>--all</emphasis> to see output for tests
+	  with status <emphasis>PASS</emphasis> (success, as expected)
+	  <emphasis>XFAIL</emphasis> (failure, as expected), or
+	  <emphasis>WARNING</emphasis> (minor error in the test case
+	  itself).</para></listitem>
+	</varlistentry>
+
+        <varlistentry>
+          <term><option>--build [string]</option></term>
+	  <listitem><para><emphasis>string</emphasis> is a full configuration
+	  ``triple'' name as used by <command>configure</command>. 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.</para></listitem>
+	</varlistentry>
+
+        <varlistentry>
+          <term><option>--host [string]</option></term>
+	  <listitem><para><symbol>string</symbol> is a full configuration
+	  ``triple'' name as used by <emphasis>configure</emphasis>.  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 <emphasis>only</emphasis> DejaGnu procedures that compare the
+	  host string with particular values.  The procedures
+	  <emphasis>ishost</emphasis>, <emphasis>istarget</emphasis>,
+	  <emphasis>isnative</emphasis>, and <emphasis>setup</emphasis>xfail}
+	  are affected by <emphasis>--host</emphasis>. In this usage,
+	  <emphasis>host</emphasis> refers to the machine that the tests are to
+	  be run on, which may not be the same as the
+	  <emphasis>build</emphasis> machine. If <emphasis>--build</emphasis>
+	  is also specified, then <emphasis>--host</emphasis> refers to the
+	  machine that the tests wil, be run on, not the machine DejaGnu is run
+	  on.</para></listitem>
+	</varlistentry>
+
+        <varlistentry>
+          <term><option>--host_board [name]</option></term>
+	  <listitem><para>The host board to use.</para></listitem>
+	</varlistentry>
+
+        <varlistentry>
+          <term><option>--target [string]</option></term>
+	  <listitem><para>Use this option to override the default setting
+	  (running native tests). <emphasis>string</emphasis> is a full
+	  configuration ``triple'' name of the form
+	  <emphasis>cpu-vendor-os</emphasis> as used by
+	  <command>configure</command>. This option changes the
+	  configuration <emphasis>runtest</emphasis> uses for the default tool
+	  names, and other setup information.</para></listitem>
+	</varlistentry>
+
+        <varlistentry>
+          <term><option>--debug</option> (-de)</term>
+	  <listitem><para>Turns on the <emphasis>expect</emphasis> internal
+	  debugging output. Debugging output is displayed as part of the
+	  <emphasis>runtest</emphasis> output, and logged to a file called
+	  <filename>dbg.log</filename>. The extra debugging output does
+	  <emphasis>not</emphasis> appear on standard output, unless the
+	  verbose level is greater than 2 (for instance, to see debug output
+	  immediately, specify <emphasis>--debug</emphasis>-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 <emphasis>--strace</emphasis> also goes into
+	  <filename>dbg.log</filename>.</para></listitem>
+	</varlistentry>
+
+        <varlistentry>
+          <term><option>--help</option> (-he)</term>
+	  <listitem><para>Prints out a short summary of the
+	  <emphasis>runtest</emphasis> options, then exits (even if you also
+	  specify other options).</para></listitem>
+	</varlistentry>
+
+        <varlistentry>
+          <term><option>--ignore [name(s)] </option></term>
+	  <listitem><para>The names of specific tests to
+	  ignore.</para></listitem>
+	</varlistentry>
+
+        <varlistentry>
+          <term><option>--objdir [path]</option></term>
+	  <listitem><para>Use <emphasis>path</emphasis> as the top directory
+	  containing any auxiliary compiled test code. This defaults to
+	  <filename>.</filename>.  Use this option to locate pre-compiled test
+	  code.  You can normally prepare any auxiliary files needed with
+	  <emphasis>make</emphasis>.</para></listitem>
+	</varlistentry>
+
+        <varlistentry>
+          <term><option>--outdir [path]</option></term>
+	  <listitem><para>Write output logs in directory
+	  <filename>path</filename>.  The default is <emphasis>.},
+	  the</emphasis> directory where you start
+	  <emphasis>runtest</emphasis>. This option affects only the summary
+	  and the detailed log files
+	  <filename>tool.sum</filename> and
+	  <filename>tool.log</filename>. The DejaGnu debug
+	  log <filename>dbg.log</filename> always appears (when requested) in
+	  the local directory.</para></listitem>
+	</varlistentry>
+
+        <varlistentry>
+          <term><option>--reboot [name]</option></term>
+	  <listitem><para>Reboot the target board when
+	  <emphasis>runtest</emphasis> 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.</para></listitem>
+	</varlistentry>
+
+        <varlistentry>
+          <term><option>--srcdir [path]</option></term>
+	  <listitem><para>Use <filename>path</filename> as the top directory
+	  for test scripts to run. <emphasis>runtest</emphasis> looks in this
+	  directory for any subdirectory whose name begins with the toolname
+	  (specified with <emphasis>--tool</emphasis>). For instance, with
+	  <emphasis>--tool</emphasis>gdb}, <emphasis>runtest</emphasis> uses
+	  tests in subdirectories <filename>gdb.*</filename> (with the usual
+	  shell-like filename expansion).  If you do not use
+	  <emphasis>--srcdir</emphasis>, <emphasis>runtest</emphasis> looks for
+	  test directories under the current working
+	  directory.</para></listitem>
+	</varlistentry>
+
+        <varlistentry>
+          <term><option>--strace [number]</option></term>
+	  <listitem><para>Turn on internal tracing for
+	  <emphasis>expect</emphasis>, 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
+	  <emphasis>case</emphasis> or <emphasis>if</emphasis> statements.
+	  Each procedure call or control structure counts as one ``level''. The
+	  output is recorded in the same file, <filename>dbg.log</filename>,
+	  used for output from <emphasis>--debug</emphasis>.</para></listitem>
+	</varlistentry>
+
+        <varlistentry>
+          <term><option>--connect [program]</option></term>
+	  <listitem><para>Connect to a target testing environment as specified
+	  by <emphasis>type</emphasis>, if the target is not the computer
+	  running <emphasis>runtest</emphasis>.  For example, use
+	  <emphasis>--connect</emphasis> to change the program used to connect
+	  to a ``bare board'' boot monitor.  The choices for
+	  <emphasis>type</emphasis> in the DejaGnu 1.4 distribution are
+	  <emphasis>rlogin</emphasis>, <emphasis>telnet</emphasis>,
+	  <emphasis>rsh</emphasis>, <emphasis>tip</emphasis>,
+	  <emphasis>kermit</emphasis>, and <emphasis>mondfe</emphasis>.</para>
+
+	  <para>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.</para></listitem>
+	</varlistentry>
+
+        <varlistentry>
+          <term><option>--baud [number]</option></term>
+	  <listitem><para>Set the default baud rate to something other than
+	  9600. (Some serial interface programs, like <emphasis>tip</emphasis>,
+	  use a separate initialization file instead of this
+	  value.)</para></listitem>
+	</varlistentry>
+
+        <varlistentry>
+          <term><option>--target_board [name(s)]</option></term>
+	  <listitem><para>The list of target boards to run tests
+	  on.</para></listitem>
+	</varlistentry>
+	
+        <varlistentry id=tool-opt>
+          <term><option>--tool[name(s)]</option></term>
+	  <listitem><para>Specifies which test suite to run, and what
+	  initialization module to use. <option>--tool</option> is used
+	  <emphasis>only</emphasis> for these two purposes. It is
+	  <emphasis>not</emphasis> used to name the executable program to
+	  test. Executable tool names (and paths) are recorded in
+	  <filename>site.exp</filename> and you can override them by specifying
+	  Tcl variables on the command line.</para>
+	  
+	  <para>For example, including "<option>--tool</option> gcc" on the
+	  <emphasis>runtest</emphasis> command line runs tests from all test
+	  subdirectories whose names match <filename>gcc.*</filename>, and uses
+	  one of the initialization modules named
+	  <filename>config/*-gcc.exp</filename>. To specify the name of the
+	  compiler (perhaps as an alternative path to what
+	  <emphasis>runtest</emphasis> would use by default), use
+	  <emphasis>GCC=binname</emphasis> on the <emphasis>runtest</emphasis>
+	  command line.</para></listitem>
+	</varlistentry>
+        
+	<varlistentry>
+          <term><option>--tool_exec [name]</option></term>
+	  <listitem><para>The path to the tool executable to
+	  test.</para></listitem>
+	</varlistentry>
+
+        <varlistentry>
+          <term><option>--tool_opts [options]</option></term>
+	  <listitem><para>A list of additional options to pass to the
+	  tool.</para></listitem>
+	</varlistentry>
+
+	<varlistentry>
+          <term><option>--verbose</option> (-v)</term>
+	  <listitem><para>Turns on more output. Repeating this option increases
+          the amount of output displayed. Level one (<emphasis>-v</emphasis>)
+          is simply test output. Level two (<emphasis>-v</emphasis>-v}) shows
+          messages on options, configuration, and process control.  Verbose
+          messages appear in the detailed (<filename>*.log</filename>) log
+          file, but not in the summary (<filename>*.sum</filename>) log
+          file.</para></listitem>
+	</varlistentry>
+        
+	<varlistentry>
+          <term><option>--version</option> (-V)</term>
+	  <listitem><para>Prints out the version numbers of DejaGnu,
+	  <emphasis>expect</emphasis> and Tcl, and exits without running any
+	  tests.</para></listitem>
+	</varlistentry>
+
+        <varlistentry>
+          <term><option>--D[0-1]</option></term>
+	  <listitem><para>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
+	  <emphasis>expect</emphasis> as the file
+	  <filename>expect/tcl-debug.ps.</filename>. If you specify
+	  <emphasis>-D1</emphasis>, the <emphasis>expect</emphasis> shell stops
+	  at a breakpoint as soon as DejaGnu invokes it. If you specify
+	  <emphasis>-D0</emphasis>, DejaGnu starts as usual, but you can enter
+	  the debugger by sending an interrupt (e.g. by typing
+	  <keycombo><keycap>C</keycap><keycap>c</keycap></keycombo>).
+	  </para></listitem>
+	</varlistentry>
+
+        <varlistentry>
+          <term><filename>testfile</filename>.exp[=arg(s)]</term>
+	  <listitem><para>Specify the names of testsuites to run. By default,
+	  <emphasis>runtest</emphasis> runs all tests for the tool, but you can
+	  restrict it to particular testsuites by giving the names of the
+	  <emphasis>.exp expect</emphasis> scripts that control
+	  them. <emphasis>testsuite</emphasis>.exp may not include path
+	  information; use plain filenames.</para></listitem>
+	</varlistentry>
+
+	<varlistentry>
+          <term><filename>testfile</filename>.exp="testfile1 ..."</term> 
+	  <listitem><para>Specify a subset of tests in a suite to run. For
+	  compiler or assembler tests, which often use a single
+	  <emphasis>.exp</emphasis> 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 <emphasis>?</emphasis>, <emphasis>*</emphasis>,
+	  and <emphasis>[chars]</emphasis>.</para></listitem>
+	</varlistentry>
+
+	<varlistentry>
+          <term><symbol>tclvar</symbol>=value</term>
+	  <listitem><para>You can define Tcl variables for use by your test
+	  scripts in the same style used with <emphasis>make</emphasis> for
+	  environment variables.  For example, <emphasis>runtest
+	  GDB=gdb.old</emphasis> defines a variable called
+	  <command>GDB</command>; when your scripts refer to
+	  <symbol>$GDB</symbol> in this run, they use the value
+	  <emphasis>gdb.old</emphasis>.</para>
+
+	  <para>The default Tcl variables used for most tools are defined in
+	  the main DejaGnu <emphasis>Makefile</emphasis>; their values are
+	  captured in the <filename>site.exp</filename> file.</para></listitem>
+	</varlistentry>
+      </variablelist>
+    </sect2>
+
+       <sect2 id=common xreflabel="Common Operations">
+        <title>Common Options</title>
+	
+	<para>Typically, you don't need must to use any command-line options.
+	<option>--tool</option> 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".</para>
+
+	<para>For example, if the directory <filename>gdb/testsuite</filename>
+	contains a collection of DejaGnu tests for GDB, you can run them like
+	this:</para>
+
+        <screen>
+	  eg$ cd gdb/testsuite
+	  eg$ runtest --tool gdb
+	</screen>
+
+	<para>Test output follows, ending with:</para>
+
+	<screen>
+		=== gdb Summary ===
+
+		# of expected passes 508
+		# of expected failures 103
+		/usr/latest/bin/gdb version 4.14.4 -nx
+	</screen>
+
+	<para>You can use the option <emphasis>--srcdir</emphasis> to point to 
+	some other directory containing a collection of tests:</para>
+
+	<screen>
+	  eg$ runtest--srcdir /devo/gdb/testsuite
+	</screen>
+
+	<para>By default, <command>runtest</command> 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 <emphasis>--all</emphasis> option.  For more
+	verbose output about processes being run, communication, and so on, use
+	<emphasis>--verbose</emphasis>. To see even more output, use multiple
+	<emphasis>--verbose</emphasis> options. for a more detailed explanation
+	of each <command>runtest</command> option.
+
+	<para>Test output goes into two files in your current directory:
+	summary output in <filename>tool.sum</filename>,
+	and detailed output in <filename>
+	tool.log</filename>. (<emphasis>tool</emphasis>
+	refers to the collection of tests; for example, after a run with
+	<emphasis>--tool</emphasis> gdb, look for output files
+	<filename>gdb.sum</filename> and <filename>gdb.log</filename>.)
+      </sect2>
+    </sect1>  
+
+    <sect1 id=outputfiles xreflabel="Output Files">
+
+    <title>The files DejaGnu produces.</title>
+
+    <para>DejaGnu always writes two kinds of output files: summary
+    logs and detailed logs.  The contents of both of these are
+    determined by your tests.</para>
+
+    <para>For troubleshooting, a third kind of output file is useful:
+    use <option>--debug</option> to request an output file showing
+    details of what <productname>Expect</productname> is doing
+    internally.</para>
+
+    <sect2 id=sum xreflabel="Summary File">
+      <title>Summary File</title>
+
+      <para>DejaGnu always produces a summary output file
+      <filename>tool.sum</filename>. This summary shows the names of
+      all test files run; for each test file, one line of output from
+      each <command>pass</command> command (showing status
+      <emphasis>PASS</emphasis> or <emphasis>XPASS</emphasis>) or
+      <command>fail</command> command (status
+      <emphasis>FAIL</emphasis> or <emphasis>XFAIL</emphasis>);
+      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 <option>--all</option>.)
+
+      <para>If any of your tests use the procedures
+      <command>unresolved</command>, <command>unsupported</command>,
+      or <command>runtested</command>, the summary output also
+      tabulates the corresponding outcomes.</para>
+
+      <para>For example, after <command>runtest --tool
+      binutils</command>, look for a summary log in
+      <filename>binutils.sum</filename>. Normally, DejaGnu writes this
+      file in your current working directory; use the
+      <option>--outdir</option> option to select a different
+      directory.</para>
+
+      <example>
+        <title>Here is a short sample summary log</title>
+
+	<screen>
+	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
+      </screen>
+    </example>
+
+    </sect2>
+
+    <sect2 id=log xreflabel="Log File">
+      <title>Log File</title>
+
+      <para>DejaGnu also saves a detailed log file
+      <filename>tool.log</filename>, showing any output generated by
+      tests as well as the summary output. For example, after
+      <command>runtest --tool binutils</command>, look for a detailed
+      log in <filename>binutils.log</filename>. Normally, DejaGnu
+      writes this file in your current working directory; use the
+      <option>--outdir</option> option to select a different
+      directory.</para>
+
+
+      <example>
+        <title>Here is a brief example showing a detailed log for
+        <productname>G++</productname> tests</title>
+
+	<screen>
+	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
+	</screen>
+	</example>
+
+    </sect2>
+
+    <sect2 id=debugfile xreflabel="Debug Log File">
+      <title>Debug Log File</title>
+
+      <para>With the <option>--debug</option> option, you can request
+      a log file showing the output from
+      <productname>Expect</productname> itself, running in debugging
+      mode. This file (<filename>dbg.log</filename>, in the directory
+      where you start <command>runtest</command>) shows each pattern
+      <productname>Expect</productname> considers in analyzing test
+      output.</para>
+
+      <para>This file reflects each <command>send</command> command,
+      showing the string sent as input to the tool under test; and
+      each <productname>Expect</productname> command, showing each
+      pattern it compares with the tool output.</para>
+
+      <example>
+        <title>The log messages begin with a message of the form</title>
+
+	<screen>
+
+	expect: does {<symbol>tool output</symbol>} (spawn_id <symbol>n</symbol>)
+	 match pattern {<emphasis>expected pattern</emphasis>}?
+
+        </screen>
+      </example>
+
+      <para>For every unsuccessful match,
+      <productname>Expect</productname> issues a
+      <emphasis>no</emphasis> after this message; if other patterns
+      are specified for the same <productname>Expect</productname>
+      command, they are reflected also, but without the first part of
+      the message (<emphasis>expect... match pattern</emphasis>).</para>
+
+      <para>When <productname>Expect</productname> finds a match, the
+      log for the successful match ends with <emphasis>yes</emphasis>,
+      followed by a record of the <productname>Expect</productname>
+      variables set to describe a successful match.</para>
+
+      <example>
+        <title>Here is an excerpt from the debugging log for a
+        <productname>GDB</productname> test:</title>
+
+	<screen>
+	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
+	</screen>
+	</example>
+
+	<para>This example exhibits three properties of
+	<productname>Expect</productname> and
+	<productname>DejaGnu</productname> that might be surprising at
+	first glance:</para>
+
+	<itemizedlist mark="bullet">
+	<listitem><para>Empty output for the first attempted match.  The
+	first set of attempted matches shown ran against the output
+	<emphasis>{}</emphasis> --- that is, no
+	output. <productname>Expect</productname> 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).</para></listitem>
+
+	<listitem><para>Interspersed tool output.  The beginning of
+	the log entry for the second attempted match may be hard to
+	spot: this is because the prompt <emphasis>{(gdb) }</emphasis>
+	appears on the same line, just before the
+	<emphasis>expect:</emphasis> that marks the beginning of the
+	log entry.</para></listitem>
+
+	<listitem><para>Fail-safe patterns.  Many of the patterns
+	tested are fail-safe patterns provided by
+	<productname>GDB</productname> testing utilities, to reduce
+	possible indeterminacy.  It is useful to anticipate potential
+	variations caused by extreme system conditions
+	(<productname>GDB</productname> might issue the message
+	<emphasis>virtual memory exhausted</emphasis> in rare
+	circumstances), or by changes in the tested program
+	(<emphasis>Undefined command</emphasis> is the likeliest
+	outcome if the name of a tested command changes).</para>
+
+	<para>The pattern <emphasis>{return}</emphasis> is a
+	particularly interesting fail-safe to notice; it checks for an
+	unexpected <keycap>RET</keycap> prompt.  This may happen,
+	for example, if the tested tool can filter output through a
+	pager.</para>
+
+	<para>These fail-safe patterns (like the debugging log itself)
+	are primarily useful while developing test scripts.  Use the
+	<command>error</command> procedure to make the actions for
+	fail-safe patterns produce messages starting with
+	<emphasis>ERROR</emphasis> on standard output, and in the
+	detailed log file.</para></listitem>
+	</itemizedlist>
+    </sect2>
+   </sect1>
+  </chapter>
+  
+  <chapter id=Customizing xreflabel="Customizing DejaGnu">
+    <title>Customizing DejaGnu</title>
+    
+    <para>The site configuration file, <filename>site.exp</filename>,
+    captures configuration-dependent values and propagates them to the
+    DejaGnu test environment using Tcl variables.  This ties the
+    DejaGnu test scripts into the <command>configure</command> and
+    <command>make</command> programs. If this file is setup correctly,
+    it is possible to execute a test suite merely by typing
+    <command>runtest</command>.</para>
+
+    <para>DejaGnu supports two <filename>site.exp</filename>
+    files. The multiple instances of <filename>site.exp</filename> are
+    loaded in a fixed order built into DejaGnu. The first file loaded
+    is the local file <filename>site.exp</filename>, and then the
+    optional global <filename>site.exp</filename> file as
+    pointed to by the <symbol>DEJAGNU</symbol> environment
+    variable.</para>
+
+    <para>There is an optional <emphasis>master</emphasis>
+    <filename>site.exp</filename>, capturing configuration values that
+    apply to DejaGnu across the board, in each configuration-specific
+    subdirectory of the DejaGnu library directory.
+    <command>runtest</command> loads these values first. The master
+    <filename>site.exp</filename> contains the default values for all
+    targets and hosts supported by DejaGnu. This master file is
+    identified by setting the environment variable
+    <symbol>DEJAGNU</symbol> to the name of the file. This is also
+    refered to as the ``global'' config file.</para>
+
+    <para>Any directory containing a configured test suite also has a
+    local <filename>site.exp</filename>, capturing configuration values
+    specific to the tool under test.  Since <command>runtest</command>
+    loads these values last, the individual test configuration can
+    either rely on and use, or override, any of the global values from
+    the global <filename>site.exp</filename> file.</para>
+
+    <para>You can usually generate or update the testsuite's local 
+    <filename>site.exp</filename> by typing <command>make
+    site.exp</command> in the test suite directory, after the test
+    suite is configured.</para>
+
+    <para>You can also have a file in your home directory called
+    <filename>.dejagnurc</filename>. This gets loaded first before the
+    other config files. Usually this is used for personal stuff, like
+    setting the <symbol>all_flag</symbol> so all the output gets
+    printed, or your own verbosity levels. This file is usually
+    restricted to setting command line options.</para>
+
+    <para>You can further override the default values in a
+    user-editable section of any <filename>site.exp</filename>, or by
+    setting variables on the <command>runtest</command> command
+    line.</para>
+
+    <sect1 id=local xreflabel="Local Config File">
+      <title>Local Config File</title>
+    
+      <para>It is usually more convenient to keep these <emphasis>manual
+      overrides</emphasis> in the <filename>site.exp</filename>
+      local to each test directory, rather than in the global
+      <filename>site.exp</filename> in the installed DejaGnu
+      library. This file is mostly for supplying tool specific info
+      that is required by the test suite.</para>
+
+      <para>All local <filename>site.exp</filename> files have
+      two sections, separated by comment text. The first section is
+      the part that is generated by <command>make</command>. It is
+      essentially a collection of Tcl variable definitions based on
+      <filename>Makefile</filename> environment variables. Since they
+      are generated by <command>make</command>, they contain the
+      values as specified by <command>configure</command>.  (You can
+      also customize these values by using the <option>--site</option>
+      option to <command>configure</command>.) In particular, this
+      section contains the <filename>Makefile</filename>
+      variables for host and target configuration data. Do not edit
+      this first section; if you do, your changes are replaced next
+      time you run <command>make</command>.</para>
+
+      <example>
+        <title>The first section starts with</title>
+
+	<programlisting>
+	## these variables are automatically generated by make ##
+	# Do not edit here. If you wish to override these values
+	# add them to the last section
+	</programlisting>
+      </example>
+
+      <para>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 <command>runtest</command>. This allows you to
+      easily customize <command>runtest</command> 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.)</para>
+
+      <example>
+        <title>The first section ends with this line</title>
+
+	<programlisting>
+	## All variables above are generated by configure. Do Not Edit ##
+	</programlisting>
+      </example>
+
+      <para>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
+      <symbol>host_triplet</symbol>, <symbol>build_triplet</symbol>,
+      <symbol>target_triplet</symbol>. All other variables are tool
+      dependant. ie for testing a compiler, the value for
+      <symbol>CC</symbol> might be set to a freshly built binary, as
+      opposed to one in the user's path.</para>
+
+      <para>Here's an example local site.exp file, as used for
+      <productname>GCC/G++</productname> testing.</para>
+
+      <example>
+        <title>Local Config File</title>
+
+      <programlisting>  
+      ## 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 ##
+    
+      </programlisting>  
+    </example>
+
+    <para>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.</para>
+
+    </sect1>
+     <sect1 id=global xreflabel="Global Config File">
+      <title>Global Config File</title>
+    
+      <para>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
+      <emphasis>canadian cross</emphasis>. 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.</para>
+
+      <para>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.</para>
+
+      <example>
+       <title>Global Config file</title>
+
+      <programlisting>
+
+      # 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" }
+          }
+      }
+      </programlisting>
+    </example>
+
+    <para>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.</para>
+
+    <para>As you can see, all one does is set the variable
+    <symbol>target_list</symbol> to the list of targets and options to
+    test. The simple settings, like for
+    <emphasis>sparc64-elf</emphasis> only require setting the name of
+    the single board config file. The <emphasis>mips-elf</emphasis>
+    target is more complicated. Here it sets the list to three target
+    boards. One is the default mips target, and both
+    <emphasis>wilma</emphasis> <emphasis>barney</emphasis> are
+    symbolic names for other mips boards. Symbolic names are covered
+    in the <xref linkend=addboard> chapter. The more complicated
+    example is the one for <emphasis>mips-lsi-elf</emphasis>. This one
+    runs the tests with multiple iterations using all possible
+    combinations of the <option>--soft-float</option> and the
+    <option>--el</option> (little endian) option. Needless to say,
+    this last feature is mostly compiler specific.</para>
+
+    </sect1>
+
+    <sect1 id=boardconfig xreflabel="Board Config File">
+      <title>Board Config File</title>
+   
+      <para>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 <xref
+      linkend=addboard> chapter. </para>
+
+      <para>An example board config file for a GNU simulator is as
+      follows. <function>set_board_info</function> is a procedure that sets the
+      field name to the specified value. The procedures in square brackets
+      <emphasis>[]</emphasis> are <emphasis>helper procedures</emphasis>. 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.</para>
+
+      <example>
+        <title>Board Config File</title>
+
+      <programlisting>
+      # 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
+      </programlisting>
+     </example>
+
+     <para>There are five helper procedures used in this example. The first
+     one, <function>find gcc</function> 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
+     <function>libgloss_include_flags</function> &
+     <function>libgloss_link_flags</function>. These return the proper flags to
+     compiler and link an executable image using <xref
+     linkend=libgloss>, the GNU BSP (Board Support Package). The final
+     procedures are <function>newlib_include_flag</function> &
+     <function>newlib_include_flag</function>. These find the Newlib C
+     library, which is a reentrant standard C library for embedded systems
+     comprising of non GPL'd code.</para>
+
+    </sect1>
+
+    <sect1 id=releng xreflabel="Remote Host Testing">
+      <title>Remote Host Testing</title>
+
+      <note><para>Thanks to Dj Delorie for the original paper that
+      this section is based on.</para></note>
+
+      <para>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.</para>
+
+      <para>The recommended source for a win95/win98/NT based ftp
+      server is to get IIS (either IIS 1 or Personal Web Server) from
+      <ulink
+      URL="http://www.microsoft.com">http://www.microsoft.com</ulink>.
+      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.</para>
+
+      <para>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.</para>
+
+      <para>You'll also need a telnet server. For win95/win98/NT, go
+      to the <ulink URL="http://ataman.com">Ataman</ulink> 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.</para>
+
+      <para>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.</para>
+
+      <para>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:</para>
+
+      <example>
+        <title>Remote host setup</title>
+
+      <screen>
+      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
+
+      </screen>
+      </example>
+
+      <para>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.</para>
+
+      <para>Edit the global <filename> site.exp</filename> to reflect your
+      boards directory:</para>
+
+      <example>
+        <title>Add The Board Directory</title>
+
+	<programlisting>
+	lappend boards_dir "/usr/local/swamp/testing/boards"
+	</programlisting>
+	</example>
+
+	<para>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:</para>
+
+      <example>
+        <title>Setup Cross Remote Testing</title>
+
+	<programlisting>
+	./MkTestDir sh-hms /usr/dejagnu/src/devo
+	</programlisting>
+	</example>
+
+	<para>If you are testing a native PC compiler (ex: you have
+	gcc.exe in your PATH on the PC), do this:
+
+      <example>
+        <title>Setup Native Remote Testing</title>
+
+	<programlisting>
+	./MkTestDir '' /usr/dejagnu/src/devo
+	</programlisting>
+      </example>
+
+	<para>To test the setup, <command>ftp</command> 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.</para>
+
+      <example>
+        <title>Run Test Remotely</title>
+
+	<programlisting>
+	cd /usr/local/swamp/testing
+	make  -k -w check RUNTESTFLAGS="--host_board foobar --target_board foobar -v -v" > check.out 2>&1
+	</programlisting>
+	</example>
+
+	<para>To run a specific test, use a command like this (for
+	this example, you'd run this from the gcc directory that
+	MkTestDir created):</para>
+
+      <example>
+        <title>Run a Test Remotely</title>
+
+	<programlisting>
+	make check RUNTESTFLAGS="--host_board sloth --target_board sloth -v compile.exp=921202-1.c"
+	</programlisting>
+      </example>
+
+	<para>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.</para>
+
+    </sect1>
+
+    <sect1 id=configfile xreflabel="Config File Values">
+      <title>Config File Values</title>
+    
+      <para>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 <symbol>target_info</symbol>, and it has two indices. The
+      following fields are part of the array.</para>
+
+      <sect1 id=optiondefs xreflabel="Option Variables">
+        <title>Command Line Option Variables</title>
+
+	<para>In the user editable second section of the <xref
+	linkend=personal> you can not only override the configuration
+	variables captured in the first section, but also specify
+	default values for all on the <command>runtest</command>
+	command line options.  Save for <option>--debug</option>,
+	<option>--help</option>, and <option>--version</option>, each 
+	command line option has an associated Tcl variable.  Use the
+	Tcl <command>set</command> 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
+	<filename>site.exp</filename>.  <xref linkend=invoking>, for
+	explanations of the command-line options.</para>
+
+	<para><table frame=all rowsep=0 colsep=0>
+	  <title>Tcl Variables For Command Line Options</title>
+
+	  <tgroup cols=3 align="char" rowsep=1 colsep=0>
+	  <thead><row>
+	    <entry>runtest</entry><entry>Tcl</entry>
+	    <entry>option</entry><entry>variable</entry><entry>description</entry>
+	  </row></thead>
+	  <tbody>
+
+	  <row>
+	    <entry>--all</entry>
+	    <entry>all_flag</entry>
+	    <entry>display all test results if set</entry>
+	  </row>
+
+	  <row>
+	    <entry>--baud</entry>
+	    <entry>baud</entry>
+	    <entry>set the default baud rate to something other than
+	    9600.</entry>
+	  </row>
+
+	  <row>
+	    <entry>--connect</entry>
+	    <entry>connectmode</entry>
+	    <entry><command>rlogin</command>,
+	    <command>telnet</command>, <command>rsh</command>,
+	    <command>kermit</command>, <command>tip</command>, or
+	    <command>mondfe</command></entry>
+	  </row>
+
+	  <row>
+            <entry>--outdir</entry>
+	    <entry>outdir</entry>
+	    <entry>directory for <filename>tool.sum</filename> and
+	    <filename>tool.log.</filename></entry>
+	  </row>
+
+	  <row>
+	    <entry>--objdir</entry>
+	    <entry>objdir</entry>
+	    <entry>directory for pre-compiled binaries</entry>
+	  </row>
+
+	  <row>
+	    <entry>--reboot</entry>
+	    <entry>reboot</entry>
+	    <entry>reboot the target if set to
+	    <emphasis>"1"</emphasis>; do not reboot if set to
+	    <emphasis>"0"</emphasis> (the default).</entry>
+	  </row>
+
+	  <row>
+	    <entry>--srcdir</entry>
+	    <entry>srcdir</entry>
+	    <entry>directory of test subdirectories</entry>
+	  </row>
+
+	  <row>
+	    <entry>--strace</entry>
+	    <entry>tracelevel</entry>
+	    <entry>a number: Tcl trace depth</entry>
+	  </row>
+
+	  <row>
+	    <entry>--tool</entry>
+	    <entry>tool</entry>
+	    <entry>name of tool to test; identifies init, test subdir</entry>
+	  </row>
+
+	  <row>
+	    <entry>--verbose</entry>
+	    <entry>verbose</entry>
+	    <entry>verbosity level.  As option, use multiple times; as
+	    variable, set a number, 0 or greater.</entry>
+	  </row>
+
+	  <row>
+	    <entry>--target</entry>
+	    <entry>target_triplet</entry>
+	    <entry>The canonical configuration string for the target.</entry>
+	  </row>
+
+	  <row>
+	    <entry>--host</entry>
+	    <entry>host_triplet</entry>
+	    <entry>The canonical configuration string for the host.</entry>
+	  </row>
+
+	  <row>
+	    <entry>--build</entry>
+	    <entry>build_triplet</entry>
+	    <entry>The canonical configuration string for the build
+	    host.</entry>
+	  </row>
+
+	  </tbody>
+	  </tgroup>
+	  </table>
+	</para>
+
+    </sect1>
+
+    <sect1 id=personal xreflabel="Personal Config File">
+      <title>Personal Config File</title>
+    
+      <para>The personal config file is used to customize
+      <command>runtest's</command> behaviour for each person. It's
+      typically used to set the user prefered setting for verbosity,
+      and any experimental Tcl procedures. My personal
+      <filename>~/.dejagnurc</filename> file looks like:</para>
+
+      <example>
+        <title>Personal Config File</title>
+
+	<programlisting>
+	set all_flag 1
+	set RLOGIN /usr/ucb/rlogin
+	set RSH /usr/local/sbin/ssh
+	</programlisting>
+      </example>
+
+      <para>Here I set <symbol>all_flag</symbol> so I see all the test
+      cases that PASS along with the ones that FAIL. I also set
+      <symbol>RLOGIN</symbol> to the BSD version. I have
+      <productname>Kerberos</productname> 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 <symbol>RSH</symbol> to the <productname>SSH</productname>
+      secure shell, as rsh is mostly used to test unix
+      machines within a local network here.</para>
+
+    </sect1>
+
+  </chapter>
+  
+  <chapter id=Extending xreflabel="Extending DejaGnu">
+    <title>Extending DejaGnu</title>
+    
+    <sect1 id=addsuite  xreflabel="Adding a new Test Suite">
+      <title>Adding A New Test Suite</title>
+    
+      <para>The testsuite for a new tool should always be located in that tools
+      source directory. DejaGnu require the directory be named
+      <filename>testsuite</filename>. Under this directory, the test cases go
+      in a subdirectory whose name begins with the tool name. For example, for
+      a tool named <emphasis>flubber</emphasis>, each subdirectory containing
+      testsuites must start with <emphasis>"flubber."</emphasis>.</para>
+
+    </sect1>
+
+    <sect1 id=addtool xreflabel="Adding A New Tool">
+      <title>Adding A New Tool</title>
+    
+      <para>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
+      <productname>Expect</productname> and <productname>Tcl</productname> in
+      general.</para>
+
+      <para>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.</para>
+
+      <para>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
+      <filename>example/</filename> directory of the DejaGnu distribution
+      contains both an interactive tool called <command>calc</command>, 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!)</para>
+
+      <para>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.</para>
+
+      <itemizedlist mark=bullet>
+      
+      <listitem><para>Create or select a directory to contain your new
+      collection of tests. Change into that directory (shown here as
+      <filename>testsuite</filename>):</para>
+              
+      <para>Create a <filename>configure.in</filename> 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 <symbol>target_abbrev</symbol>; this value is the link to the
+      init file you will write soon.  (For simplicity, we assume the
+      environment is Unix, and use <emphasis>unix</emphasis> as the
+      value.)</para>
+
+      <para>What else is needed in <filename>configure.in</filename> 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 <productname>GNU Autoconf</productname>. </para></listitem>
+
+      <listitem><para>Create <filename>Makefile.in</filename> (if you are using
+      Autoconf), or <filename>Makefile.am</filename>(if you are using
+      Automake), the source file used by configure to build your
+      <filename>Makefile</filename>. If you are using GNU Automake.just add the
+      keyword <emphasis>dejagnu</emphasis> to the
+      <emphasis>AUTOMAKE_OPTIONS</emphasis> variable in your
+      <filename>Makefile.am</filename> file. This will add all the Makefile
+      support needed to run DejaGnu, and support the <xref linkend=makecheck>
+      target.</para>
+
+      <para>You also need to include two targets important to DejaGnu:
+      <emphasis>check</emphasis>, to run the tests, and
+      <emphasis>site.exp</emphasis>, to set up the Tcl copies of
+      configuration-dependent values. This is called the <xref linkend=local>
+      The check target must run the <command>runtest</command> program to
+      execute the tests.</para>
+
+      <para>The <filename>site.exp</filename> 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 <command>runtest</command> on the command
+      line.</para>
+
+      <example>
+        <title>Sample Makefile.in Fragment</title>
+
+	<programlisting>
+	# 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 <symbol>${example}</symbol> --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 <symbol>${examplename}</symbol> <symbol>${example}</symbol>" >> ./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?
+
+	    </programlisting>
+	    </example>
+	  </listitem>
+	  
+	  <listitem><para>Create a directory (in <filename>testsuite</filename>)
+	  called <filename>config</filename>. Make a <emphasis>Tool Init
+	  File</emphasis> in this directory. Its name must start with the
+	  <symbol>target_abbrev</symbol> value, or be named
+	  <filename>default.exp</filename> so call it
+	  <filename>config/unix.exp</filename> 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 <command>runtest</command> to run.</para>
+
+	  <para>If the program being tested is not interactive, you can get
+	  away with this minimal <filename>unix.exp</filename> to begin
+	  with:</para>
+
+	  <example>
+	    <title>Simple Batch Program Tool Init File</title>
+	  
+	  <programlisting>
+	  
+	  proc foo_exit {} {}
+	  proc foo_version {} {}
+
+	  </programlisting>
+	  </example>
+
+	  <para>If the program being tested is interactive, however, you might
+	  as well define a <emphasis>start</emphasis> routine and invoke it by
+	  using an init file like this:</para>
+
+	  <example>
+	    <title>Simple Interactive Program Tool Init File</title>
+
+	  <programlisting>
+	
+	  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
+
+	  </programlisting>
+	  </example>
+	  </listitem>
+
+	  <listitem><para>Create a directory whose name begins with your tool's
+	  name, to contain tests. For example, if your tool's name is
+	  <emphasis>gcc</emphasis>, then the directories all need to start with
+	  <emphasis>"gcc."</emphasis>.</para></listitem>
+
+	  <listitem><para>Create a sample test file. Its name must end with
+	  <filename>.exp</filename>. You can use
+	  <filename>first-try.exp</filename>. To begin with, just write there a
+	  line of Tcl code to issue a message.</para>
+
+	  <example>
+	    <title>Testing A New Tool Config</title>
+
+	  <programlisting>
+
+	  send_user "Testing: one, two...\n"
+
+	  </programlisting>
+	  </example>
+  	  </listitem>
+
+	  <listitem><para>Back in the <filename>testsuite</filename> (top
+	  level) directory, run <command>configure</command>. 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.</para></listitem>
+
+	  <listitem><para>e now ready to triumphantly type <command>make
+	  check</command> or <command>runtest</command>.  You should see
+	  something like this:</para>
+
+	  <example>
+	    <title>Example Test Case Run</title>
+
+	  <screen>
+	  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 ===
+
+	 </screen>
+	 </example>
+
+	 <para>There is no output in the summary, because so far the example
+	 does not call any of the procedures that establish a test
+	 outcome.</para></listitem>
+
+	 <listitem><para>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. </para></listitem>
+
+    </itemizedlist>
+
+    </sect1>
+
+    <sect1 id=addtarget xreflabel="Adding A New Target">
+      <title>Adding A New Target</title>
+    
+      <para>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.</para>
+
+      <para>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.</para>
+
+      <para>When you code an initialization module, be generous in printing
+      information controlled by the <function>verbose</function>
+      procedure.</para>
+
+      <para>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.</para>
+
+      <para>If you suspect a communication problem, try running the connection
+      interactively from <productname>Expect</productname>.  (There are three
+      ways of running <productname>Expect</productname> as an interactive
+      interpreter.  You can run <productname>Expect</productname> with no
+      arguments, and control it completely interactively; or you can use
+      <command>expect -i</command> together with other command-line options and
+      arguments; or you can run the command <command>interpreter</command> from
+      any <productname>Expect</productname> procedure.  Use
+      <command>return</command> to get back to the calling procedure (if any),
+      or <command>return -tcl</command> to make the calling procedure itself
+      return to its caller; use <command>exi</command>t or end-of-file to leave
+      Expect altogether.)  Run the program whose name is recorded in
+      <symbol>$connectmode</symbol>, with the arguments in
+      <symbol>$targetname</symbol>, to establish a connection.  You should at
+      least be able to get a prompt from any target that is physically
+      connected.</para>
+
+    </sect1>
+
+    <sect1 id=addboard xreflabel="Adding A New Board">
+      <title>Adding A New Board</title>
+    
+      <para>Adding a new board consists of creating a new board config
+      file. Examples are in
+      <filename>dejagnu/baseboards</filename>. 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
+      <emphasis>baseboard</emphasis> 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 <symbol>boards_DATA</symbol> list in the
+      <filename>dejagnu/baseboards/Makefile.am</filename>, and regenerate the
+      Makefile.in using automake. Then just rebuild and install DejaGnu. You
+      can test it by:</para>
+
+      <para>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 <function>load_generic_config</function> and
+      <function>load_base_board_description</function>. 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.</para> 
+
+      <example>
+      <title>Testing a New Board Config File</title>
+
+      <screen>
+      make check RUNTESTFLAGS="--target_board=<emphasis>newboardfile</emphasis>".
+      </screen>
+      </example>
+
+      <para>Here's an example of a board config file. There are
+      several <emphasis>helper procedures</emphasis> 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
+      <emphasis>[]</emphasis>, which is the Tcl execution characters.</para> 
+
+      <example>
+      <title>Example Board Config File</title>
+
+      <programlisting>
+
+      # 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
+
+      </programlisting>
+      </example>
+
+    </sect1>
+
+    <sect1 id=boarddefs xreflabel="Board File Values">
+      <title>Board Config File Values</title>
+
+      <para>These fields are all in the <symbol>board_info</symbol> These are
+      all set by using the <function>set_board_info</function> procedure. The
+      parameters are the field name, followed by the value to set the field
+      to.</para>
+
+  	 <para><table frame=all rowsep=0 colsep=0>
+	  <title>Common Board Info Fields</title>
+
+	  <tgroup cols=3 align="char" rowsep=1 colsep=0>
+	  <thead><row>
+	    <entry>Field</entry>
+	    <entry>Sample Value</entry>
+	    <entry>Description</entry>
+	  </row></thead>
+	  <tbody>
+
+	  <row>
+	    <entry>compiler</entry>
+	    <entry>"[find_gcc]"</entry>
+	    <entry>The path to the compiler to use.</entry>
+	  </row>
+
+	  <row>
+	    <entry>cflags</entry>
+	    <entry>"-mca"</entry>
+	    <entry>Compilation flags for the compiler.</entry>
+	  </row>
+
+	  <row>
+	    <entry>ldflags</entry>
+	    <entry>"[libgloss_link_flags] [newlib_link_flags]"</entry>
+	    <entry>Linking flags for the compiler.</entry>
+	  </row>
+
+	  <row>
+	    <entry>ldscript</entry>
+	    <entry>"-Wl,-Tidt.ld"</entry>
+	    <entry>The linker script to use when cross compiling.</entry>
+	  </row>
+
+	  <row>
+	    <entry>libs</entry>
+	    <entry>"-lgcc"</entry>
+	    <entry>Any additional libraries to link in.</entry>
+	  </row>
+
+	  <row>
+	    <entry>shell_prompt</entry>
+	    <entry>"cygmon>"</entry>
+	    <entry>The command prompt of the remote shell.</entry>
+	  </row>
+
+	  <row>
+	    <entry>hex_startaddr</entry>
+	    <entry>"0xa0020000"</entry>
+	    <entry>The Starting address as a string.</entry>
+	  </row>
+
+	  <row>
+	    <entry>start_addr</entry>
+	    <entry>0xa0008000</entry>
+	    <entry>The starting address as a value.</entry>
+	  </row>
+
+	  <row>
+	    <entry>startaddr</entry>
+	    <entry>"a0020000"</entry>
+	    <entry></entry>
+	  </row>
+
+	  <row>
+	    <entry>exit_statuses_bad</entry>
+	    <entry>1</entry>
+	    <entry>Whether there is an accurate exit status.</entry>
+	  </row>
+
+	  <row>
+	    <entry>reboot_delay</entry>
+	    <entry>10</entry>
+	    <entry>The delay between power off and power on.</entry>
+	  </row>
+
+	  <row>
+	    <entry>unreliable</entry>
+	    <entry>1</entry>
+	    <entry>Whether communication with the board is unreliable.</entry>
+	  </row>
+
+	  <row>
+	    <entry>sim</entry>
+	    <entry>[find_sim]</entry>
+	    <entry>The path to the simulator to use.</entry>
+	  </row>
+
+	  <row>
+	    <entry>objcopy</entry>
+	    <entry>$tempfil</entry>
+	    <entry>The path to the <command>objcopy</command> program.</entry>
+	  </row>
+
+	  <row>
+	    <entry>support_libs</entry>
+	    <entry>"${prefix_dir}/i386-coff/"</entry>
+	    <entry>Support libraries needed for cross compiling.</entry>
+	  </row>
+
+	  <row>
+	    <entry>addl_link_flags</entry>
+	    <entry>"-N"</entry>
+	    <entry>Additional link flags, rarely used.</entry>
+	  </row>
+
+	  </tbody>
+	  </tgroup>
+	  </table>
+	</para>
+
+	 <para>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.</para>
+
+  	 <para><table frame=all rowsep=0 colsep=0>
+	  <title>Board Info Fields For GCC & GDB</title>
+
+	  <tgroup cols=3 align="char" rowsep=1 colsep=0>
+	  <thead><row>
+	    <entry>Field</entry>
+	    <entry>Sample Value</entry>
+	    <entry>Description</entry>
+	  </row></thead>
+	  <tbody>
+
+	  <row>
+	    <entry>strip</entry>
+	    <entry>$tempfile</entry>
+	    <entry>Strip the executable of symbols.</entry>
+	  </row>
+
+	  <row>
+	    <entry>gdb_load_offset</entry>
+	    <entry>"0x40050000"</entry>
+	  </row>
+
+	  <row>
+	    <entry>gdb_protocol</entry>
+	    <entry>"remote"</entry>
+	    <entry>The GDB debugging protocol to use.</entry>
+	  </row>
+
+	  <row>
+	    <entry>gdb_sect_offset</entry>
+	    <entry>"0x41000000";</entry>
+	  </row>
+
+	  <row>
+	    <entry>gdb_stub_ldscript</entry>
+	    <entry>"-Wl,-Teva-stub.ld"</entry>
+	    <entry>The linker script to use with a GDB stub.</entry>
+	  </row>
+
+	  <row>
+	    <entry>gdb_init_command</entry>
+	    <entry>"set mipsfpu none"</entry>
+	  </row>
+
+	  <row>
+	    <entry>gdb,cannot_call_functions</entry>
+	    <entry>1</entry>
+	    <entry>Whether GDB can call functions on the target,</entry>
+	  </row>
+
+	  <row>
+	    <entry>gdb,noargs</entry>
+	    <entry>1</entry>
+	    <entry>Whether the target can take command line arguments.</entry>
+	  </row>
+
+	  <row>
+	    <entry>gdb,nosignals</entry>
+	    <entry>1</entry>
+	    <entry>Whether there are signals on the target.</entry>
+	  </row>
+
+	  <row>
+	    <entry>gdb,short_int</entry>
+	    <entry>1</entry>
+	  </row>
+
+	  <row>
+	    <entry>gdb,start_symbol</entry>
+	    <entry>"_start";</entry>
+	    <entry>The starting symbol in the executable.</entry>
+	  </row>
+
+	  <row>
+	    <entry>gdb,target_sim_options</entry>
+	    <entry>"-sparclite"</entry>
+	    <entry>Special options to pass to the simulator.</entry>
+	  </row>
+
+	  <row>
+	    <entry>gdb,timeout</entry>
+	    <entry>540</entry>
+	    <entry>Timeout value to use for remote communication.</entry>
+	  </row>
+
+	  <row>
+	    <entry>gdb_init_command</entry>
+	    <entry>"print/x \$fsr = 0x0"</entry>
+	  </row>
+
+	  <row>
+	    <entry>gdb_load_offset</entry>
+	    <entry>"0x12020000"</entry>
+	  </row>
+
+	  <row>
+	    <entry>gdb_opts</entry>
+	    <entry>"--command gdbinit"</entry>
+	  </row>
+
+	  <row>
+	    <entry>gdb_prompt</entry>
+	    <entry>"\\(gdb960\\)"</entry>
+	    <entry>The prompt GDB is using.</entry>
+	  </row>
+
+	  <row>
+	    <entry>gdb_run_command</entry>
+	    <entry>"jump start"</entry>
+	  </row>
+
+	  <row>
+	    <entry>gdb_stub_offset</entry>
+	    <entry>"0x12010000"</entry>
+	  </row>
+
+	  <row>
+	    <entry>use_gdb_stub</entry>
+	    <entry>1</entry>
+	    <entry>Whether to use a GDB stub.</entry>
+	  </row>
+
+	  <row>
+	    <entry>use_vma_offset</entry>
+	    <entry>1</entry>
+	  </row>
+
+	  <row>
+	    <entry>wrap_m68k_aout</entry>
+	    <entry>1</entry>
+	  </row>
+
+	  <row>
+	    <entry>gcc,no_label_values</entry>
+	    <entry>1</entry>
+	  </row>
+
+	  <row>
+	    <entry>gcc,no_trampolines</entry>
+	    <entry>1</entry>
+	  </row>
+
+	  <row>
+	    <entry>gcc,no_varargs</entry>
+	    <entry>1</entry>
+	  </row>
+
+	  <row>
+	    <entry>gcc,stack_size</entry>
+	    <entry>16384</entry>
+	    <entry>Stack size to use with some GCC testcases.</entry>
+	  </row>
+
+	  <row>
+	    <entry>ieee_multilib_flags</entry>
+	    <entry>"-mieee";</entry>
+	  </row>
+
+	  <row>
+	    <entry>is_simulator</entry>
+	    <entry>1</entry>
+	  </row>
+
+	  <row>
+	    <entry>needs_status_wrapper</entry>
+	    <entry>1</entry>
+	  </row>
+
+	  <row>
+	    <entry>no_double</entry>
+	    <entry>1</entry>
+	  </row>
+
+	  <row>
+	    <entry>no_long_long</entry>
+	    <entry>1</entry>
+	  </row>
+
+	  <row>
+	    <entry>noargs</entry>
+	    <entry>1</entry>
+	  </row>
+
+	  <row>
+	    <entry>nullstone,lib</entry>
+	    <entry>"mips-clock.c"</entry>
+	  </row>
+
+	  <row>
+	    <entry>nullstone,ticks_per_sec</entry>
+	    <entry>3782018</entry>
+	  </row>
+
+	  <row>
+	    <entry>sys_speed_value</entry>
+	    <entry>200</entry>
+	  </row>
+
+	  <row>
+	    <entry>target_install</entry>
+	    <entry>{sh-hms}</entry>
+	  </row>
+
+	  </tbody>
+	  </tgroup>
+	  </table>
+	</para>
+
+    </sect1>
+
+    <sect1 id=writing xreflabel="Writing A Test Case">
+      <title>Writing A Test Case</title>
+    
+      <para>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.</para>
+
+      <para>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 <filename>lib/c-torture.exp</filename> in the GCC test
+      suite. Most tests of this kind use very few
+      <productname>expect</productname> features, and are coded almost
+      purely in Tcl.</para>
+
+      <para>Writing the complete suite of C tests, then, consisted of
+      these steps:</para>
+
+      <itemizedlist mark=bullet>
+      <listitem><para>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.</para></listitem>
+
+      <listitem><para>Writing (and debugging) the generic Tcl procedures for
+      compilation.</para></listitem>
+
+      <listitem><para>Writing the simple test driver: its main task is to
+      search the directory (using the Tcl procedure
+      <emphasis>glob</emphasis> for filename expansion with wildcards)
+      and call a Tcl procedure with each filename.  It also checks for
+      a few errors from the testing procedure.</para></listitem>
+      </itemizedlist>
+
+      <para>Testing interactive programs is intrinsically more
+      complex.  Tests for most interactive programs require some trial
+      and error before they are complete.</para>
+
+      <para>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.</para>
+
+    </sect1>
+
+    <sect1 id=debugging xreflabel="Debugging A Test Case">
+      <title>Debugging A Test Case</title>
+    
+      <para>These are the kinds of debugging information available
+      from DejaGnu:</para>
+
+      <itemizedlist mark=bullet>
+
+      <listitem><para>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
+      <command>verbose</command> procedure (which in turn uses the
+      variable also called <emphasis>verbose</emphasis>) 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 <emphasis>$verbose</emphasis> is
+      <emphasis>0</emphasis>, there should be no output other than the
+      output from <emphasis>pass</emphasis>,
+      <emphasis>fail</emphasis>, <emphasis>error</emphasis>, and
+      <emphasis>warning</emphasis>.  Then, to whatever extent is
+      appropriate for the particular test, allow successively higher
+      values of <emphasis>$verbose</emphasis> to generate more
+      information.  Be kind to other programmers who use your tests:
+      provide for a lot of debugging information.</para>
+
+      <listitem><para>Output from the internal debugging functions of
+      Tcl and <productname>Expect</productname>. There is a command
+      line options for each; both forms of debugging output are
+      recorded in the file <filename>dbg.log</filename> in the current
+      directory.</para> 
+
+      <para>Use <option>--debug</option> 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
+       <filename>dbg.log</filename> can allow you to create the final
+       patterns by ``cut and paste''.  This is sometimes the best way
+       to write a test case.</para>
+
+       <listitem><para>Use <option>--strace</option> 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.</para></listitem>
+
+       <listitem><para>Finally, if the value of
+       <emphasis>verbose</emphasis> is 3 or greater,DejaGnu turns on
+       the expect command <command>log_user</command>.  This command
+       prints all expect actions to the expect standard output, to the
+       detailed log file, and (if <option>--debug</option> is on) to
+       <filename>dbg.log</filename>.</para>
+       </itemizedlist>
+
+    </sect1>
+
+    <sect1 id=adding xreflabel="Adding A Test Case To A Test Suite">
+      <title>Adding A Test Case To A Test Suite.</title>
+    
+      <para>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.</para>
+
+      <para>Adding a GCC test can be very simple: just add the C code
+      to any directory beginning with <filename>gcc</filename>. and it
+      runs on the next <programlisting>runtest --tool
+      gcc</programlisting>.</para>
+
+      <para>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 <emphasis>.exp</emphasis> 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
+      <filename>Makefile.in</filename> file for that test directory,
+      then run <command>configure</command> and
+      <command>make</command>.</para>
+
+      <para>Adding a test by creating a new directory is very
+      similar:</para>
+
+      <itemizedlist mark=bullet>
+
+      <listitem><para>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 <filename>g++.other</filename>. There can
+      be multiple test directories that start with the same tool name
+      (such as <emphasis>g++</emphasis>).</para></listitem>
+
+      <listitem><para>Add the new directory name to the
+      <symbol>configdirs</symbol> definition in the
+      <filename>configure.in</filename> file for the test suite
+      directory. This way when <command>make</command> and
+      <command>configure</command> next run, they include the new
+      directory.</para></listitem>
+
+      <listitem><para>Add the new test case to the directory, as
+      above. </para>
+
+      <listitem><para>To add support in the new directory for
+      configure and make, you must also create a
+      <filename>Makefile.in</filename> and a
+      <filename>configure.in</filename>.</para></listitem> 
+      </itemizedlist>
+
+    </sect1>
+
+    <sect1 id=hints xreflabel="Hints On Writing A Test Case">
+      <title>Hints On Writing A Test Case</title>
+    
+      <para>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 <command>expect</command>
+      command. In this situation, the precise boundary that determines
+      which <command>expect</command> 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>-re</option> option for the <command>expect</command>
+      command to write the pattern as a full regular expressions; then
+      you can match the end of output using a <emphasis>$</emphasis>.
+      It is also a good idea to write patterns that match all
+      available output by using <emphasis>.*\</emphasis> after the
+      text of interest; this will also match any intervening blank
+      lines.  Sometimes an alternative is to match end of line using
+      <emphasis>\r</emphasis> or <emphasis>\n</emphasis>, but this is
+      usually too dependent on terminal settings.</para>
+
+      <para>Always escape punctuation, such as <emphasis>(</emphasis>
+      or <emphasis>"</emphasis>, in your patterns; for example, write
+      <emphasis>\(</emphasis>.  If you forget to escape punctuation,
+      you will usually see an error message like <programlisting>extra
+      characters after close-quote.</programlisting></para>
+
+      <para>If you have trouble understanding why a pattern does not
+      match the program output, try using the <option>--debug</option>
+      option to <command>runtest</command>, and examine the debug log
+      carefully.</para>
+
+      <para>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 <emphasis>set height
+      0\n</emphasis> command.  The purpose is simply to make sure GDB
+      never calls a paging program.  The <emphasis>set
+      height</emphasis> command in GDB does not generate any
+      output; but running any command makes GDB issue a new
+      <emphasis>(gdb) </emphasis> prompt.  If there were no
+      <command>expect</command> command to match this prompt, the
+      output <emphasis>(gdb) </emphasis> begins the text seen by the
+      next <command>expect</command> command---which might make that
+      pattern fail to match.</para>
+
+      <para>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
+      <command>error</command> or <command>warning</command>.</para>
+
+    </sect1>
+
+    <sect1 id=tvariables xreflabel="Test Case Variables">
+      <title>Special variables used by test cases.</title>
+    
+      <para>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
+      <filename>site.exp</filename>. You can use the value of these variables,
+      but they should never be changed.</para>
+
+        <variablelist>
+          <varlistentry>
+            <term>$prms_id</term>
+	    <listitem><para>The tracking system (e.g. GNATS) number identifying
+	    a corresponding bugreport.  (<emphasis>0</emphasis>} if you do not
+	    specify it in the test script.)</para></listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term>$item bug_id</term>
+	    <listitem><para>An optional bug id; may reflect a bug
+	    identification from another organization.  (<emphasis>0</emphasis>
+	    if you do not specify it.)</para></listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term>$subdir</term>
+	    <listitem><para>The subdirectory for the current test
+	    case.</para></listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term>$expect_out(buffer)</term>
+	    <listitem><para>The output from the last command. This is an
+	    internal variable set by Expect. More information can be found in
+	    the Expect manual.</para></listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term>$exec_output</term>
+	    <listitem><para>This is the output from a
+	    <function>${tool}_load</function> 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.</para></listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term>$comp_output</term>
+	    <listitem><para>This is the output from a
+	    <function>${tool}_start</function> command.  This is conventionally
+	    used for batch oriented programs, like GCC and GAS, that may
+	    produce interesting output (warnings, errors) without further
+	    interaction.</para></listitem> 
+          </varlistentry>
+        </variablelist>
+
+    </sect1>
+   
+</chapter>
+
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 <stdlib.h>
+#endif
+#include <ctype.h>
+#include <stdio.h>
+#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 <<EOF
+#line 545 "configure"
+#include "confdefs.h"
+#include <assert.h>
+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 <<EOF
+#line 562 "configure"
+#include "confdefs.h"
+#include <assert.h>
+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
+#line 597 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+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 <<EOF
+#line 637 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char strcmp(); below.  */
+#include <assert.h>
+/* 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 <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/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 <<EOF
+
+# 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%@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 <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
+EOF
+cat >> $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 <<EOF
+  CONFIG_HEADERS="calc.h"
+EOF
+cat >> $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 <<CEOF' >> $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 <<EOF
+
+EOF
+cat >> $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 <regexp> 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 <regexp> 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 <regexp> 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 <regexp>
+#	(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<foo> 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<foo> 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 <rob@welcomehome.org>
+- updated to the latest snapshot
+- added doc files
+- added the site.exp config file
+
+* Mon Jul 12 1999 Tim Powers <timp@redhat.com>
+- updated to 19990628
+- updated patches as needed
+- added %defattr in files section
+
+* Wed Mar 10 1999 Jeff Johnson <jbj@redhat.com>
+- add alpha expect patch (#989)
+- use %configure
+
+* Thu Dec 17 1998 Jeff Johnson <jbj@redhat.com>
+- Update to 19981215.
+
+* Thu Nov 12 1998 Jeff Johnson <jbj@redhat.com>
+- Update to 1998-10-29.
+
+* Wed Jul  8 1998 Jeff Johnson <jbj@redhat.com>
+- Update to 1998-05-28.
+
+* Sun Feb  1 1998 Jeff Johnson <jbj@jbj.org>
+- 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
+
+
+
+
+
+
+
+