FileIO.mesaThisinterfacecontainsprocstocreatefilestreams.Italsospecifiesamodelforthebehavioroffilestreams.Lasteditedby:MBrownonJanuary6,19838:21pmDIRECTORYCIFSUSING[OpenFile],EnvironmentUSING[bytesPerPage],FileUSING[Capability],IOUSING[STREAM],JuniperUSING[LFH,Transaction],RopeUSING[ROPE],TransactionUSING[Handle,nullHandle];FileIO:CEDARDEFINITIONSIMPORTSTransaction=BEGINROPE:TYPE=Rope.ROPE;STREAM:TYPE=IO.STREAM;bytesPerPage:CARDINAL=Environment.bytesPerPage;FilestreamsBasicusageMostprogramsthatcreatefilestreamscandosowithaverysimplecalltoFileIO.Open.SupposethatrisaRope.ROPEcontainingafilename,andyourprogramneedstoreadcharactersfromthefilenamedbyr(localfilenameorafullpathname)usinganIO.STREAMs.Thecalls_FileIO.Open[r];inyourprogramwillaccomplishthis.Ifyourprogramwillcompletelyrewritethefilenamedbyr(ignoringtheoldcontentsandcreatingafileofthatnameifnoneexists),thecalliss_FileIO.Open[r,overwrite];Ifyourprogramissimplyloggingoutputtothefilenamedbyr(itdoesnotreadthefile,butsimplyaddsnewcharacterstotheend,andcreatesanewfileofthatnameifnoneexists),itcallss_FileIO.Open[r,append];Finally,ifyourprogramwillbothreadandwritethefilenamedbyr(treatsthefileasanextendible,random-accesssequenceofbytesthatitupdates"inplace"),itusess_FileIO.Open[r,write];(ThelastthreeformsonlyworkforlocalfilesunlessyouhavethePinepackageloadedandstarted,inwhichcasetheyalsoworkforfilesontheJuniperserver.Notethatitisanunusualprogramthatrequireswritemode,whileoverwritemodeisusedfrequently.)Ifyoudonotwishtolandinthedebuggerifthefilenamerismisspelledorotherwisegarbled,yourprogramshouldcatchFileIO.OpenFailedwithwhy=fileNotFoundorwhy=illegalFileName.Themoralofthistale:doingsimplethingsissimple.Youdon'tneedtounderstandthemultitudeofparameterstothestreamcreationprocs,sincetheydefaultcorrectlyformostpurposes.Youdon'tneedtouseanyprocfromthisinterfaceexceptOpenunlessyouaredoingsomethingspecial.Thereisonlyp a q ^ (t?"3$*,k/Y46?:<?yEKG% \r Zc0X"s V)Tur4TuTu R s_RDRrRR QsQQrQxQ sO\rO\sQO\rO\~O\MsMMr>MsMrMM KsKKrKsUKrgKKJB sJBhJBrJBJBM GsjG5G FrDU sB@r@s@@rt@Y@s@@r@s?<r?<s?<?<r-?<s?<|?<rY?<s?<rz?<= s==r=j=p 9W Ht 5 q 3# ydk!$b&n(6+V,/468D A7F 1|  J hs1|1|qb1|1|/"%E(u-13q6 <@>BD / Qx#'Zs)K/)/q*/s*/q0/0/24 -M C * /  "$'-0 7<?AF^H )="#.%'P*-/?2779<" & C  $ svg#%("*/91H2d4G7:=B?BE "j ( 1 X$&(+`-/358z=>V  C  ]ye"o"%d(+c-2u459@B  E!"i').0K . C   He[ N#&*-03?6n;@@CG 'B~x! "%e*/3x6s79;AF Yn k!%']* 3047: <@AEMG/  '*:06:@E   &_(#+-  S}n % &+/267 ? AzG d"&)-3f58?BF2 5 X#'+.1 4;@EFu^TVm$ onesignaltocatch.Atthesametime,itispossibletodomoreambitiousthings.Ifyouwanttoknowmore,readon.FilestreammodelAfileisasequence[0..fileLen)ofmutablebytes;thelength(fileLen)ofafilecanbechanged.Thestateofafilestreamisafilefile(perhapsopenedunderatransaction)withlengthfileLen,anindexstreamIndexIN[0..fileLen],plusanumberofreadonlyflags(accessOptions,closeOptions)andabooleanvariableclosedwhichjointlydeterminetheeffectofstreamprocs.Inasectionbelow,"WhatSTREAMoperationsdowhenappliedtoafileSTREAM",wedescribeeachstreamprocdefinedintheIOinterface(GetChar,PutChar,etc.)intermsofthesequantities.ConcurrencyFilestreamsprovidenointerlockstocontrolconcurrentaccesstofiles.Instead,theyrelyontheunderlyingfilesystemforconcurrencycontrol.Juniperuseslockingtoprovideconcurrencycontrol.ThePilotfilesystemusedonthelocaldiskprovidesnoconcurrencycontrol,thoughifallofitsclientsusedCIFSandplayedstrictlybytherulestherewouldbenoproblems.Untilthathappyday,clientsoffilestreamsforlocalfilesshouldtakecarethatifafilestreamisopenforwritingafile,nootherreadersorwritersofthatfileexist.Itisparticularlydangeroustohavetwofilestreamsopenforwritingthesamefile.Individualfilestreamsareindependentobjects,sothereisneveranyneedtosynchronizecallstotheirprocedures.Iftwoprocessesaretoshareasinglefilestream,theymustsynchronizetheiraccessestothatstreamatalevelabovethefilestreamcalls;individualfilestreamcalls(PutChar,PutBlock,etc.)arenotguaranteedtobeatomic.PragmaticsAPilotfileisrepresentedasasequenceofdiskpagescontainingbytesPerPagebytes.Thereisasingleleaderpage(overhead)thatisusedtoholdfilepropertiessuchasthelengthandcreatedate.Thereisnofunctionalrelationshipbetweenthelengthofafile(inbytes)andthesizeofthatfile(inpages).Allocatingdiskpagestoafileisanexpensiveoperation,especiallywhendoneincrementally(onepageatatime).Ifaclientiscreatingafilewhoseeventuallengthitcanestimate,itshouldusethecreateLengthparametertoOpentoallocateenoughpagestoholdtheentirelengthallatonce;ifthefilealreadyexiststheclientshouldcreateastreamandthenextendthefileusingSetLength.Ifthefilestreamimplementationmustextendafileitwillalwaysextenditbyseveralpages;ifaskedtoshortenafileitwillsimplyadjustthelengthfieldintheleaderpagewithoutfreeinganypages.Tofreeextrapageswhenastreamisclosed,usethetruncatePagesOnCloseCloseOptioninthecallthatcreatesthestream.CreatingafileSTREAMFileSystem:TYPE={pilot,juniper};Trans:TYPE=RECORD[body:SELECTtype:FileSystemFROMpilot=>[trans:Transaction.Handle],juniper=>[trans:Juniper.Transaction_NIL],ENDCASE];Usedtounifythetwotypesoftransaction,forOpenonly.OpenFailed:SIGNAL[why:OpenFailure,fileName:ROPE]RETURNS[retryFileName:ROPE];OpenFailure:TYPE={fileNotFound,illegalFileName,fileAlreadyExists,cantUpdateTiogaFile,wrongTransactionType,unknownFileCapability,notImplementedYet};2q b) 1 _ GBE $*/1Z47m9<@Ct \W 3q Y y Nw` X$j(x*/46y7: <> W  nK &D+/0- 7:>CEu Uk sUk UkqrUkUk #%+d.u/Uk/Uk q7,Uku8Uk8Uk q?`Uk@]UkCD> Su2SSqDSASa"Q$(*c.35f6;L?sD@SDSq R Q:s wR!Rq%AR%R&(.T159>?sB RBRqCRD2R Pun@E v$ t M" q J[ C c"W'O .{249>ADG/ H 2 "~(X-057k< D G  Q_"% *, 4y9>G?AChEJ Ees &Ee EeqEeEe> #h&+- /59 DBG; 8 a s!t 5 q 2 }7 "$'+e 2# :>CDuE 1:f T*!$'D -0259]<@(DH# / u c!%'(+H-p1}4569?:=@0BW - YD, %&y - 3B7:} CFH +m d n  g$t)-/'17.8c<?AS )_ZK!'$&)+/357g;AE (  i#' +.1p5{ =?BTE &w 3D #F','-~/z4 8:5> ?DEH9 $ Bm@!Y#(+z05g8%=?JB4E #( ;-+ 35s7:]=+ADp t  rs@r"Tt /rp/sm/'/r/s/~/r/sr-G s!X"r[=/~( s)/*/r+/,/srq ?>~7 &(,t [ r[s[t[r[[ $s+a[,5[r.r[s/Z[0.[r5K[5[ s?c[@7[rBu[B[t rf sd  r   #.)91 5 /<v) TVm$kThissignalisraisedbythevariousfilestreamcreationprocedures.CreateOptions:TYPE={none,newOnly,oldOnly};SeedescriptionofOpenbelow.AccessOptions:TYPE={read,append,write,overwrite};Usedatthetimeastreamiscreatedtospecifythesetofoperationsallowedonastream.DisallowedoperationsraiseIO.Error[NotImplementedForThisStream]whencalled.Thecharacteristicsofeachoption:read:PutChar,PutBlock,SetLengtharedisallowed,andtheinitialstreamIndexis0.overwrite:alloperationsareallowed,thefileistruncatedtozerolengthatstreamcreationtime,andtheinitialstreamIndexis0.append:GetChar,GetBlock,SetLength,SetIndexaredisallowed,andtheinitialstreamIndexisfileLen.write:alloperationsareallowed,andtheinitialstreamIndexis0.CloseOptions:TYPE=CARDINAL;CloseOptionsdetermineoptionalprocessingduringFlushandClosecalls.IfcommitAndReopenTransOnFlush,thenFlush"checkpoints"thetransactionbeingusedbythestream.IftruncatePagesOnClose,thenClosecausesextrapagesofthefiletobefreed.IffinishTransOnClose,thenClosecausesthetransactiontobecommittedoraborted,accordingtotheabortflagtoClose.noCloseOptions:CloseOptions=0;commitAndReopenTransOnFlush:CloseOptions=1;truncatePagesOnClose:CloseOptions=2;finishTransOnClose:CloseOptions=4;defaultCloseOptions:CloseOptions=truncatePagesOnClose+finishTransOnClose;RawOption:TYPE=BOOL;ThisparameterdeterminesthemodeofaccesstoTiogaformatfiles.Ifraw=FALSEandfileisinTiogaformat,thenifaccessOptions=read,readonlytheplaintextportionofthefile(ignore"looks"andnodeswiththecommentproperty);ifaccessOptions#readoroverwrite,raiseOpenFailure[cantUpdateTiogaFile].Ifraw=TRUEorfileisnotinTiogaformat,thenoperateontheentirefile.StreamBufferParms:TYPE=RECORD[bufferSize:INT[2..127],SpecifiesthenumberofpagesofVMusedbythestreamforbuffering.Juniperstreamsalwaysuse1pageofbuffering.bufferSwapUnitSize:INT[1..32]];Specifiesthenumberofpagesineachuniformswapunitofthestreambuffer.defaultStreamBufferParms:StreamBufferParms=[bufferSize:25,bufferSwapUnitSize:5];Goodformostpurposes.minimumStreamBufferParms:StreamBufferParms=[bufferSize:2,bufferSwapUnitSize:1];Goodwhenopeningastreamjusttocreateafileorsetitslength.Open:PROC[fileName:ROPE,accessOptions:AccessOptions_read,createOptions:CreateOptions_none,closeOptions:CloseOptions_defaultCloseOptions,transaction:Trans_[juniper[]],raw:RawOption_FALSE,createLength:INT_5*bytesPerPage,streamBufferParms:StreamBufferParms_defaultStreamBufferParms]RETURNS[STREAM];!OpenFailedwithwhy=fileNotFound:createOptions=oldOnlyandfiledoesnotexist(includingservernotfound3q b)npl!#(m- t _ r_s_R_r__P%q ] ^)t [z r[zs[zh[zr[z[z$Q(' q Yii"(#(^*,.s 5:!<=<Bs X% s4X%X%qzX%X%"/3v8;D~F^ V~T%' .147 ?A8R I6  3%'*b+136:#M +-=;R $&; #V%;9) #%3U5:t 7_r7_s7_l7_r 7_s7_7_r7_q 5! %#$(*.~368j;s= 5=5qA5A5CFOG 4  !|#H&),.2P49;U=?D 2cJ %'P 0;2L57 >A 0s 0!Z0q$10$0%(Q),%-16s9>v@vBFt .;r.;s.;k.;r .;s.;.;r#F.;, s ,,r,,-a *;g "$'|*,/35 <A)9WG 's'r'r~'' I %;g "$'-"03x517<$1*, 4T6C " H  ,. 67D )  7"%H&*,#.0P2m4Ht r.s+rs\rM H k! = U!   E d 3sr s.r9/ =l&( s r sc r-  u - mi7 5  !^#C(f+ -]0b26 <_@ABv) TVm$RwhenfileNameisafullpathname).illegalFileName:syntaxorothererrorcauseddirectorylookuptofail.fileAlreadyExists:createOptions=newOnlyandfilealreadyexists.cantUpdateTiogaFile:raw=FALSE,accessOptions#read,andfileisinTiogaformat.wrongTransactionType:transactionisanon-nullPilottransactionbutfileNameisaJuniperfile,orvice-versa.notImplementedYet:CIFSaccessisimpliedbutaccessOptions#read.!Juniper.Errorwithwhy=transactionReset,notDone:don'tknowhowtohandlethese.!CIFS.Errorwithcode#illegalFileName,noSuchFile,noSuchHost:don'tknowhowtohandlethese.!Volume.InsufficientSpace:couldn'tcreatefileonlocalvolumeasrequested.CreateanewstreamonthefilespecifiedbyfileName(afullpathname).IfaccessOptions=readthencreateOptions=oldOnlyareassumed.IfcreateOptions=noneornewOnlyandthefilespecifiedbyfileNamedoesnotexist,thencreateit,withinitialsize(inpagesexcludingleaderpage)ofcreateLength/bytesPerPage(roundedup),andinitiallength(inbytes)zero.IffileNamespecifiestheserver"Juniper"andtransactioneitherhaspilotvariantandcontainsTransaction.nullHandleorhasjunipervariantbutcontainsNIL([juniper[]]producesthis),thencallJuniper.UserInit[],andcreateanewtransactionbycallingJuniper.BeginTransaction.StreamFromOpenFile:PROC[openFile:CIFS.OpenFile,accessOptions:AccessOptions_read,closeOptions:CloseOptions_defaultCloseOptions,transaction:Transaction.Handle_Transaction.nullHandle,raw:RawOption_FALSE,streamBufferParms:StreamBufferParms_defaultStreamBufferParms]RETURNS[STREAM];!OpenFailedwithwhy=notImplementedYet:accessOptions#read.Createanewfilestreamontheopenfile.StreamFromCapability:PROC[capability:File.Capability,accessOptions:AccessOptions_read,closeOptions:CloseOptions_defaultCloseOptions,fileName:ROPE_NIL,transaction:Transaction.Handle_Transaction.nullHandle,raw:RawOption_FALSE,streamBufferParms:StreamBufferParms_defaultStreamBufferParms]RETURNS[STREAM];!OpenFailedwithwhy=cantUpdateTiogaFile:raw=FALSE,accessOptions#read,andfileisinTiogaformat.unknownFileCapability:nofileidentifiedbycapabilityispresentonthelocaldiskvolume.Createanewstreamonthefileidentifiedbycapability(notethatStreamFromCapabilityaddspermissionstocapabilityasrequiredtoperformtheaccessesasspecifiedinaccessOptions).fileNameisstoredinthestream,fordiagnosticpurposeswhenastreamerroroccurs.CapabilityFromStream:PROC[self:STREAM]RETURNS[File.Capability];!IO.Error[NotImplementedForThisStream]:selfisnotastreamonaPilotfile4ub&t=T"f `wX e#'B+1:57[ ^ #%r+-0 4 ]` w!]"]u%]&s] / 04L69D:AC&SQc-$>(8*,/4f6 qNta!')/1&36L_ P5P v )++0h2I| N$'i), 139<?BzEH5&*6./@FF D n"(+w 2698<ASD+Bd!%*-L25 <BFi@"#& -/4(t >;r>;s>;>;rt>;<sM<<r<2<: H k!9/   7 !#853s55r54#l&( s2ur2usc2ur-2u2uu0- mi7 / %'' q,tek!%=t *rm*sk**r*(e & H k!%   #Ys#Y\#Yr#Ys#Yy#Yr#Y! !#83srNl&( srscr-u- mi7 Br`BBu Bw!B"Bu%Br&~B'#B u/>B1#B47#9w:<@i  " (r*+Nu01W2_78;@>Ajqw " (+ 1q5$8FSj  X R&/(*-0{57>?{L"t$ +)045:?=t @rm@sk@@r@ s  r s r c u 5w- 5 5u 5 5#r(u 5( 5u+ 5+c 5,k.04b6U7:v) BTVm$Returnthefilecapabilityforthefileunderlyingself.Thiscapabilityhasthepermissionsthatarenecessarytoperformstreamoperations.StreamFromLFH:PROC[lfh:Juniper.LFH,accessOptions:AccessOptions_read,closeOptions:CloseOptions_defaultCloseOptions,fileName:ROPE_NIL,transaction:Juniper.Transaction,raw:RawOption_FALSE]RETURNS[STREAM];!OpenFailedwithwhy=cantUpdateTiogaFile:raw=FALSE,accessOptions#read,andfileisinTiogaformat.unknownFileCapability:nofilewiththegivenLFHispresentonJuniper.CreateanewstreamontheJuniperfileidentifiedbylfh.fileNameisadebuggingaid,fordiagnosticpurposeswhenastreamerroroccurs.END.WhatSTREAMoperationsdowhenappliedtoafileSTREAMBasicSTREAMprocsIO.GetChar:PROC[self:STREAM]RETURNS[CHAR]IfstreamIndex=fileLenthenERRORIO.EndOfStream.Elsereturnfile[streamIndex],andsetstreamIndex_streamIndex+1.IO.PutChar:PROC[self:STREAM,char:CHAR]IfstreamIndex=fileLenthenfileLen_fileLen+1.Thensetfile[streamIndex]_char,streamIndex_streamIndex+1.IO.GetBlock:PROC[self:STREAM,block:REFTEXT,startIndex:NAT_0,stopIndexPlusOne:NAT_LAST[NAT]]RETURNS[nBytesRead:NAT]Equivalentto(butfasterthan)stopIndexPlusOne_MIN[block.maxLength,stopIndexPlusOne];nBytesRead:NAT_MIN[fileLen-streamIndex,stopIndexPlusOne-startIndex];FORi:NATIN[0..nBytesRead)DOblock[startIndex+i]_GetChar[self]ENDLOOP;IFnBytesRead#0THENblock.length_startIndex+nBytesRead;RETURN[nBytesRead]IO.PutBlock:PROC[self:STREAM,block:REFREADONLYTEXT,startIndex:NAT_0,stopIndexPlusOne:NAT_LAST[NAT]]Equivalentto(butfasterthan)IFstopIndexPlusOne>block.maxLengthTHENstopIndexPlusOne_block.length;FORi:NATIN[startIndex..stopIndexPlusOne)DOPutChar[self,block[i]]ENDLOOP;IO.UnsafeGetBlock:UNSAFEPROC[self:STREAM,block:IO.UnsafeBlock]RETURNS[nBytesRead:INT]Equivalentto(butfasterthan)IFblock.startIndex<0ORblock.stopIndexPlusOne<0THENERRORIO.Error[BadIndex];nBytesRead:INT_MIN[fileLen-streamIndex,block.stopIndexPlusOne-block.startIndex];FORi:INTIN[0..nBytesRead)DOblock.base^[block.startIndex+i]_GetChar[self]ENDLOOP;RETURN[nBytesRead]IO.UnsafePutBlock:PROC[self:STREAM,block:IO.UnsafeBlock]5qb)y "E$ +.2 8<:= DsG;`"( t ^ r^^s\^^r^\_s\_<\_r\_Z H k!Y   WhsWh\WhrWhsWhyWhrWhU T3sTTrTsRrrRrscRrr-RrRruP- mi7 O"r`O"O"u O"w!O""O"u%O"r&~O"'#O" u/>O"1#O"47#9w:<@i M{ "%(?w+M{,M{u.M{.M{046qK" %(] .04[:<,=DsGRIX L+#' s FrFp BtxBUBpBB[#)9+J,t/B0pB ?kx ?k\?kt?k?k <@jx < g<@ g< M<@Xt M< <@ <<@<^<@y^<<@<<@<<@<7<@7<r<s<`<rE<<s<K<rw<s ^<!2<r&O<s&<r* <; hM s!0;!;%r&;'I; 038BE9[ F " 6vjx 6 g6v g6 M6vXt M6 6v 66v6H6vyH66v66v6p6vp6 6v 6r6s6J6r/66s656r`6 =6s#6$6r'658 hM !0%'z,7.0,35@kA3 F " 0jx 1 g0 g1 M0Xt M1 0 101^0y^1010c1.0.10101rJ1sH11r181s<11r 1 1s%1%1'r*1+1 s2131r5w1718sDk1ET1rGJ1s1/nr/nsy/nr/nQ/ns8/n /nr)/n/n s'/n(/nr*/n- h,os,,r,-,)V*w s*w*wr*ws*w*wr*wP*w*3s(r(E(sB(+(!r(A( s (!(r"(#(/0 s9#(9(r>(s'(r'(b'(1sK'('(r'('( %'O -/ s%r%Z% "jx # g" g# M"Xt M# " #"#H"yH#"#"c#"#"#y"y#r4#s2##r#!#s%##r# #s%#%#'.r1#2# s9#:l#rZ> s1Er<E hsrb-.s0 0rsNNrN0N srs 1r))srEsBrt s F!,rX"$ s,X-IXr20Xs r Z jx 5 g  g 5 M Xt M 5  5  5t t 5  5 n 5" " 5  5  5j yj 5  5 c 59 9 5  5  5rV 5sS 5 5r 5C 5sG 5 5r$ 5$ 5s)' 5) 5r*m 5* 5 v)TVm$Equivalentto(butfasterthan)IFblock.startIndex<0ORblock.stopIndexPlusOne<0THENERRORIO.Error[BadIndex];FORi:INTIN[block.startIndex..block.stopIndexPlusOne)DOPutChar[self,block.base^[i]]ENDLOOP;IO.CharsAvail:PROC[self:STREAM]RETURNS[BOOL]ReturnTRUE.IO.EndOf:PROC[self:STREAM]RETURNS[BOOL]ReturnstreamIndex=fileLen.IO.Flush:PROC[self:STREAM]ForceallstreamwritessincethetimeofstreamcreationortheprecedingFlushtobewrittentodisk.IfcommitAndReopenTransOnFlushthenfirstcommittrans,thenbeginanewtransactionastrans.IO.Reset:PROC[self:STREAM]IfaccessOptions#appendthensetstreamIndex_0.IO.Close:PROC[self:STREAM,abort:BOOL_FALSE]IfNOTabort,thenforceallstreamactionssincestreamcreationortheprecedingFlushtobewrittentodisk;otherwisediscardthem.IftruncatePagesOnClose,thendiscardunusedpagesfromendoffile.IffinishTransOnClose,thencommitoraborttransdependingonthestateofabort.Invalidateself(alloperationsonselfotherthanFlush,Reset,andClosewillraiseERRORIO.Error[StreamClosed];thesethreedonothing).LessbasicSTREAMprocsIO.PutBack:PROC[self:STREAM,char:CHAR]IfstreamIndex=0thenERRORIO.Error[IllegalPutBack].Otherwise,setstreamIndex_streamIndex-1,andiffile[streamIndex]#charthenERRORIO.Error[IllegalPutBack].IO.PeekChar:PROC[self:STREAM]RETURNS[char:CHAR];Equivalentto:c:CHAR_self.GetChar[];self.PutBack[c];RETURN[c];File-specificSTREAMprocsIO.GetIndex:PROC[self:STREAM]RETURNS[INT]ReturnstreamIndex.IO.SetIndex:PROC[self:STREAM,index:INT]ERRORIO.EndOfStreamifindex>fileLen.SetstreamIndex_index.IO.GetLength:PROC[self:STREAM]RETURNS[INT]ReturnfileLen.IO.SetLength:PROC[self:STREAM,length:INT]SetfileLen_l,thensetstreamIndex_MIN[streamIndex,fileLen].Thecontentsoffile[oldFileLen..fileLen)areundefined.ChangeLogCreatedbyMBrownon7-Dec-8110:33:20ByeditingFileByteStream.ChangedbyMBrownonMarch26,19824:41pmAdded"raw"parmtostreamcreateoperations.6rb& hs`{r`{b`{-.s0 `{0`{rs^^r^0^s]$r]$E]$sB]$]$rt]$]$)s0z]$1`]$r[x Rs =[x [xr%[x Xjx X gX gX MXXt MX X XXXTXTXXXXXXX X XXXVXcVXXcXrXsXXrX Xs XXr Xs!X"Xr'Xs(Xr+?XWNsWN{WNrWN Tejx T gTe gT MTeXt MT Te TTeTHTeHTTe TTenTrTsT+TrTtTsxTTrBTs)TTr%Ts%~Tr(TS#  P;jx P gP; gP MP;Xt MP P; PP;cPP;PP;P0P;0PrPsPPruPPsP|PrPNZ\".%T' +}024;9?@BGlMQ-(,.37:>?K  Hjx I+ gH gI+ MHXt MI+ H I+HI+IHII+HI+}Hy}I+rI+sI+I+rI+I+sI+I+rI+G P5 "F$c ,;- Djx E gD gE MDXt ME D EDcEDEDEFDFErEsEErvEEsE|ErEEs"E#UEr&1Es'E(wEr+\ECUsCUyCUrxCUCUp#s(+/5569Y?CE?AC#')y7:?DI@H(*+P0P259?ADEGv>_\ S %j'p)-049;?BIs<\r<<")%)<+Bt 9d x9dI9dt9d9dx 6t M6 6r6s6k6rP66s6V6r6 ^6s#6$6r'@64 hMs4a4"#r#j4#41 8: By3J D\'),s/3J03J4ur53J63Jx 0t M0 0rv0st00r0d0sh00r 20s!0!0r' 0'n0s*0+0r.O0.0/ -ts-tr-tri-t-ts(o-t)C-tr--t.$-tt * x* <* t* z* x 'Yt M'Y 'Yr('Ys&'Y'Yr'Y'Ys'Y'Yr'Ys 'Y!'Yr&'Ys''Yr)+'Y% x #.t M#. #.r#.s#.#.r{#.#.s#.#.r#. #.s$#.%7#.r&#.s!r!'! ="#<(+5 3 4x t M rsrsr s!"|r's'r*Xx t M rssrXs^r !fs&&r($.n+: %s&.'.r).)f. 17:j?:m p _q  dLu _q  (#n&}u 5+,Q! v)TVm$ChangedbyMBrownonAugust23,198210:25pmHandle->STREAM(->Streaminprocnames),introduceFileIO.OpenFailed,CIFSaccessinreadonlymode,initialfilesizeinOpen,bufferpagesandswapunits.FormatthisfileusingTioganodes.ChangedbyMBrownonOctober23,19829:59pmDefaulttransactiontoOpenisnow[juniper[]],sincethisdoesnotrequiretheaverageusertoimportTransaction(tousenullHandle).FormattousecurrentCedarstyle.ChangedbyMBrownonJanuary6,19838:15pmAttemptedtoreducetheconfusionoverwhatiscommentandwhatisnotcommentintheinterface,andtoimprovetheexplanationofAccessOptions.7q b)C #'u `ww`'`u`,` 6#;(4."w9`:`u=`=`AB ^JC#2&),158s:>^B>q \_!$V'eu Z }!e ( +k.13k7:J?5BC Y A_ !"%').2q V >#&u T|!g #&(g.,0457=?RA SGt1} !{ v)TVm$ TIMESROMAN TIMESROMAN HELVETICA TIMESROMAN TIMESROMAN TIMESROMANLAUREL TIMESROMAN TIMESROMANYF 4  N& 3 >Aj/DB fileio.mesa 9-Mar-83 22:58:31