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î/Yî4ôî6?î:™î<øî?yîEKîG%î ìï\érî ýïZcîî0îïX¯îÔîÚîî“îÙî"èsî ýïV)îïTuîrî4ïTuî—ïTu îïR sî_ïRÂîDïRÂrîŽïRÂîñïR îïQsîæïQîËïQrîïQîxïQ sîïO\î¾rîíïO\sîQïO\rîïO\î~ïO\îïM©sîïM©îôïM©rî>ïM©sî¡ïM©rîúïM©îÖïM© îïKösîÃïKöî©ïKörîòïKösîUïKörîgïKöîÊïKöîïJB sîƒïJBîhïJBrî²ïJBîïJBîM î ýïG¼sîjïG¼î5ïG¼îå îïFrîïDU î”sîïB¢îï@ïrîï@ïsîï@ïîÖï@ïrîtï@ïîYï@ïsîáï@ïîµï@ïrîóï@ïsîï?<rîÙï?<sîÖï?<î�ï?<rî-ï?<sîï?<î|ï?<rîYï?<sî°ï?<rîzï?<îï=‰ sîäï=‰î¯ï=‰rî…ï=‰îjï=‰pî ìï9Wî Htî ìï5ôî ¬qî ìï3#î yî‘îdîkîÙî!Óî$bî&nî(6î+Vî,„î/˜î4î6‘î8D îA7îFÁî ìï1|î éî Jî hsîðï1|îÄï1|qîbï1|îýï1|îî/î�î"™î%Eî(uî-øî1Îî3qî6€ î<âî@>îB’îDðî ìï/Ôî èî ðî°îîÙî�îÆîQîxî#±î'Zsî)Kï/Ôî)´ï/Ôqî*‘ï/Ôsî*èï/Ôqî0ï/Ôî0¡ï/Ôî2î4Ùî ®ï-Mî ¶îCî ìï*Çî Çî/îêî î î"âî$‘î'ùî-´î0Œ î7µî<‰î?îA«îF^îH†î ìï)îÞî=î§îîÍî"î#.î%—î'Pî*î-Þî/?î2±î77î9—î<"î ®ï&˜î ¶îC î� î ìï$î ‚îÐîsîòîvîgî#íî%¯î("î*Ÿî/9î1Hî2dî4Gî7‹î:î=Bî?µîBŠîEî ìï"jî (î îƒî1î‘î î Xî$ßî&î(öî+`î-î/çî3¦î5î8zî=î>Vî ®ïãî ¶îC î�î ìï]îîyîÅîeî"îoî"›î%dî(òî+cî-Þî2uî4‚î5œî9ÜîÇî@†îBˆ î ìïµ îîøî±îEî!î"iî'€î)ßî.õî0Kî ®ï.î ¶îC î�î ìï¨î HîÒîeî[îîî Nî#žî&–î*Ãî-„î0Õî3?î6nî;»î@@îCîGáî ìïî'îBî~îxî!îŒî ¦î"Ùî%eî*“î/Õî3xî6sî7öî9Žî;¬îAîFÁî ìïYînî î‚îkî!³î%½î']î*Î î30î4æî7Òî: î<¶î@îAþîEMîG/î ìï²î�îŠî„î‡îáî„î ‰ î'Üî*:î0þî6åî:»î@äîEúî ìï î¹îÔîÍî² î&_î(#î+î-î ìï ƒî ÔîÚî¢îSî}înî âî% î&†î+æî/î2¨î6î7Ó î? îAzîGÖî ìï Ü îïîšî÷îdî£î"¢î&î)î-Ãî3fî5 î8ùî?•îB¡îF2î ìï 5î  îîÀîëîXîþî©î#ÿî'Ïî+÷î.´î1 î4óî;›î@ýîEîFu^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î ìï_ªî çîGîÄîBî˜îîEîôî úî$�î*äî/Øî1Zî4î7mî9î<Ûî@ÆîCátî ìï\Wî ¸î3qî ìïY‘î yî âîNîwî` îXîî$jî(xî*×î/î4Àî6yî7£î: î<˜î>ˆî ìïWî ¹îßîŒî«î înîÎîíîKî ©î&Dî+î/î0- î7—î:§î>ÕîCßîEÄuî ìïUk sî¶ïUkî ïUkqîrïUkîÕïUk î¬î¦îÏî#ûî%´î+dî.žuî/ïUkî/ÈïUk qî7,ïUkuî8ïUkî8£ïUk qî?`ïUkî@]ïUkîCîD>î ìïSÄuî2ïSÄîÍïSÄqîDïSÄîAïSÄîaî¿î"Qî$Àî(›î*cî.ãî3ˆî5fî6 î;Lî?ÀsîD@ïSÄîDßïSÄqî ìïR î˜î�îQî:îçîsî wïRî!ïRqî%AïRî%ñïRî&Ìî(òî.Tî1„î5óî9î>î?ÂsîB ïRîBŠïRqîCÏïRîD2ïRî ìïPuînî@îEîóî½î vî$ tî ìïM" qî ìïJ[î îCî“îß î cî"Wî'O î.{î2Îî4Âî9î>ˆîAÝîDäîG/î ìïH´ îî‘î2î– î"~î(Xî-î0žî5—î7kî<œ îD…î ìïG î Ìîî‹îîQî_îÆî"î% î*¡î,¯ î4yî9Œî>Gî?°îA§îChîEJî ìïEesî &ïEeî ñïEeqîïEeîÀïEeîÐî>î¸î±î î#hî&ïî+î- î/î5íî9Šî îDBîG;î ìï8ûî a îsî!îtî ìï5¨ qî ìï2áî }îÈî7î§ îîÉîøî"åî$£î'•î+e î2# î:„î>þîCîDuîE¤î ìï1:îîf îTî*îžîãî!™î$Òî'D î-Ãî0ýî2³î5î9]î<î@(îDîH#î ìï/“î ò îu îõîcî!Ãî%üî'µî(ßî+Hî-pî1}î45î6”î9?î:øî=Çî@0îBWî ìï- î�î„îYîîDî¶î,î %î&y î- î3Bî7î:} îCîFHî ìï+mî dî nî§î îî²îýîîî gî$tî)Øî-òî/'î1’î7.î8cî<¿î?îAS î ìï)Æî_îÿî»îZîKî!'î$ãî&‚î)¤î+õî/Òî3ýî5Þî7gî;î»îAîEÚî ìï(î ¬îÍîªîî˜î iî#‚î' î+åî.¦î1pî5{ î=±î?”îBTîEî ìï&w îËî3î°îÚîDî šî#Fî'«î,'î-~î/zî4 î8Ôî:5î> î?ºîD¥îEÏîH9î ìï$Ðî µîBîmîéî@îŽî!Yî#Öî(î+zî0£î5gî8%î=î?JîB4îEÄî ìï#(î ¡îËî;î§î-î¢îî+Ì î3Åî5sî7Òî:]î=+îA²îDpî ìïî¤îtîîïîÊïî ýï® rî‰ï®sî‡ï®î@ï®rîÞï®îÃï®î÷î‹î"Ttî ýï/rîpï/sîmï/î'ï/rîÅï/sîªï/î~ï/rîï/îï„sîï„î¥ï„rî¾ï„î-ï„îG sî!Xï„î"ï„rîïÚî[îùî=îï/îèî~îÂî( sî)—ï/î*€ï/rî+£ï/î,ï/sîï„rîžï„îï„qî ýïÙî‘î?îÞî>îêî~î7 î&‹î(Èî,“tî ýï[ rî×ï[sîÔï[îtï[rî«ï[îï[î€ î$çsî+aï[î,5ï[rî.rï[sî/Zï[î0.ï[rî5Kï[î5®ï[ sî?cï[î@7ï[rîBuï[îBØï[tî ýï Ü rîfï Üsîdï Üîï Ürî»ï Üî ï ÜîÕ î#Úî.)î9î1ï 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)îîînîpîlîËî!“î#ýî(mî-¯ tî ýï_¨ rî›ï_¨sî™ï_¨îRï_¨rîðï_¨îÕï_¨îPî%„qî ýï]ûî“ î¥î^î)tî ýï[z rî±ï[zsî¯ï[zîhï[zrîï[zîëï[zîî$Qî(' qî ýïYÌî†îîiî„î£îîiî"(î#Ìî(^î*³î,Åî.s î5î:!î<î=<îBs î ýïX% îÒsî4ïX%îžïX%qîzïX%îÒïX%ð"î/šî3vî8—î;–îD~îF^î ýïV~î¿ïTŒî×î©îéî%‚î'Õ î.ñî1©î4î7ô î?ÌîA8î¿ïRš îIî6 îâî 3î%žî'ûî*bî+Ëî1éî3•î6–î:Îîèî#M î+Êî-¯îï=;îR î$Ïî&´îï;ŽîÚ î#Vî%;îï9àî) î#¥î%Šî3Uî5:tî ýï7_rî¶ï7_sî³ï7_îlï7_rî ï7_sîðï7_î©ï7_rîï7_qî ýï5²î!î¬ î¼î%î#î$Æî(Ýî*”î.~î3î6Þî8jî;sî= ï5²î=Æï5²qîAï5²îAÂï5²îCÝîFOîGÄî ýï4 îÄîîŒîÔ î!|î#Hî&¢î)¤î,¤î.ëî2Pî4ïî9µî;Uî=œî?ìîD�î ýï2cîàîîJîÕî î%Ãî'P î0;î2Lî5“î7‚ î>îA€ î ýï0¼î¢îîÂsî ¡ï0¼î!Zï0¼qî$1ï0¼î$ìï0¼î%ïî(Qî)·î,%î-Íî1¦î6sî9“î>vî@vîBÏîFµtî ýï.;rî´ï.;sî±ï.;îkï.;rî ï.;sîîï.;îÂï.;rî#Fï.;îï,� sî ï,�îŠï,�rî•ï,�îùï,�î-îaî ï*àîÛî;îgî î"ëî$¤î'|î*¸î,³î/î3ƒî5À î<¥îA¦îòï)9îWîÌîîGî îï'‹sîï'‹îrï'‹rî~ï'‹îáï'‹îî Iî ï%ÞîÛî;îgî î"ëî$™î'Êî-"î0”î3xî51î7‘î<îï$1îÓî*úî,ß î4Tî6‘îC‹î ï"ƒî îHî¥îï Öî €î,§î.Œ î6î7ŽîDˆî ï)î îÀî î7î"§î%Hî&÷î*ùî,#î.Œî0Pî2mî4Htî ýï¨rî.ï¨sî+ï¨îÓï¨rî¸ï¨îïúsîˆïúî\ïúrîšïúîïM îH î kî!øîï  î= î Uî!âîïò î¢ îî «îïE î„îdîñ îï—î3î’sîï—îØï—rî½ï—îïê sîÄïêî.ïêrî9ïêîÆïêîûî/ îï=îlî&“î( sîï �rîï �sîcï �rî-ï �î�ï �uîï âî- îmîiî7î ï 5 îÚ î!^î#Cî(fî+ î-]î0bî2Åî6 î<_î@AîB¤vî)Èïÿ ¨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]:selfisnotastreamonaPilotfile4uîòïb&îtî=î©îÞîTî"fî ï`wîXî¬î eî#æî'Bî+žî1:î5¶î7[î ï^Éî î#�î%rî+î-¶î0 î4Çî ï]î`î wî!æï]î"–ï]uî%–ï]î&sï] î/ î0ðî4Lî6ðî9Dî:°î¨îA�îC&îáïSîïQcî-îî$>î(8î*Œî,€î/Æî4fî6 qîïNáîtî�î‹îüîîaî!Ëî'‡î)‚î/ƒî1&î3±î6×îïL_î� îPî5îPî v î)+î+î0hî2»îïIÜî| îîïîNîþî$Æî'iî)µî, î1³î3›î9‡î<¤î?îBzîEŒîïH5îËîôîîî¨îÝî¶î&î*6î.î/Ìî@ŸîF«îïFŽîÆî±îëîî îïD î²îÓînîïî"î(Ÿî+w î2•î6¢î98î<•îASîD+îïBdî¥î„î!î%øî*°î-Lî2Êî5ø î<âîBÛîFiîï@½î™îùî±î"³î#Ýî&Ë î-Çî/Ãî4(tî ýï>;rîéï>;sîçï>;îŽï>;rîtï>;îï<ŒsîMï<Œîï<ŒrîÛï<Œî2ï<Œîï:Þ îH î kî!øîï9/ î¢ îî «îï7€ î„î!«î#8îï5Òî3î’sîï5ÒîØï5Òrî½ï5Òîï4#îlî&“î( sîï2urîï2usîcï2urî-ï2uî�ï2uuîï0Æî- îmîiî7î ï/î� î%'î' qîï,–îtî�î‹îõîeîkî!Ëî%=tî ýï*rîmï*sîkï*îï*rîøï*îï(e îÈîï&¶ îH î kî!øîï% î¢ îî «îï#Ysîˆï#Yî\ï#Yrîï#Ysî�ï#Yîyï#Yrîœï#Yîï!« î„î!«î#8îïüî3î’sîïüîØïürî½ïüîïNîlî&“î( sîïŸrîïŸsîcïŸrî-ïŸî�ïŸuîïñî- îmîiî7î ïBrî`ïBîäïBuî ïBwî!ñïBî"¡ïBuî%¢ïBrî&~ïBî'#ïB uî/>ïBî1#ïBî4€î7#î9wî:ãî<‰î@iî ï“î°î £î"÷ î(Ùrî*³ï“î+Nï“uî0ôï“î1Wï“î2_î7î8ôî;@î>‡îAjqîïî“îÛîèîwîœî î"£ î(÷î+ î1qî5$î8îFSîïj îÏîÊ îXî Rî&/î(*î-Ïî0{î5ÿî7úî>î?þîïÃîî{îžîLî¬î"tî$± î+)î0ïî4¤î5Îî:?î=°tî ýï@rîmï@sîkï@îï@rîøï@îï ’sîï ’î±ï ’rîÜï ’sîï ãrîï ãîcï ãuîï 5wî-ï 5î©ï 5uî†ï 5îÞï 5ð#rî(uï 5î(ùï 5uî+ï 5î+cï 5î,kî.Ïî0î4bî6Uî7Šî:Ü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]5qîïb)î¼îîy î´îëî"Eî$¨ î+“î.íî2 î8<î:«î= îDsîG;îï`‚î"îÐî(î˜ tî ýï^ rî^ï^sî\ï^îï^rîèï^îï\_î¯sîƒï\_î<ï\_rîÜï\_îïZ· îH î kî!øîïY î¢ îî «îïWhsîˆïWhî\ïWhrîïWhsî�ïWhîyïWhrîœïWhîïUÁ î„îïTî3î’sîïTîØïTrî½ïTsîïRrrîïRrsîcïRrrî-ïRrî�ïRruîïPÊî- îmîiî7î ïO"rî`ïO"îäïO"uî ïO"wî!ñïO"î"¡ïO"uî%¢ïO"rî&~ïO"î'#ïO" uî/>ïO"î1#ïO"î4€î7#î9wî:ãî<‰î@iî ïM{î°î £î"÷î%óî(?wî+ËïM{î,ŽïM{uî.–ïM{î.ùïM{î0î4¤î6—qîïKî¦îî"îÅîýî �î%Âî(] î.Åî0óî4[î:Žî<,î=ˆîDsîGRîïIX î†îLîî+î#›î' sî ýïFÝrî…ïFÝpî ìïBºtîxïBºîUïBºpîïBºîæïBºîî[î#—î)9î+Jî,¼tî/”ïBºî0pïBºî ìï?kxî ¬ï?kî\ï?ktîêï?kîšï?kî ýï<@þjxî ýï<ªî gï<@þæî gï<ªî Mï<@þXtî Mï<ªî ¥ï<@þî ¥ï<ªî¹ï<@þ¥î¹ï<ªî^ï<@þyî^ï<ªîØï<@þóîØï<ªîËï<@þ»îËï<ªî†ï<@þ°î†ï<ªî7ï<@þ„î7ï<ªrî»ï<ªsî¹ï<ªî`ï<ªrîEï<ªî¨ï<ªsî¬ï<ªîKï<ªrîwï<ªsî ^ï<ªî!2ï<ªrî&Oï<ªsî&²ï<ªrî* ï<ªîï;î� îhîMî sî!0ï;î!éï;î%¬rî&òï;î'Iï; î0Úî3Òî8îBÝîE”îáï9[ î¹îF î î"î ýï6vþjxî ýï6ßî gï6vþæî gï6ßî Mï6vþXtî Mï6ßî ¥ï6vþçî ¥ï6ßî�ï6vþ»î�ï6ßîHï6vþyîHï6ßîÂï6vþóîÂï6ßîµï6vþ»îµï6ßîpï6vþ°îpï6ßî ï6vþ„î ï6ßrî¥ï6ßsî¢ï6ßîJï6ßrî/ï6ßî’ï6ßsî–ï6ßî5ï6ßrî`ï6ßî =ï6ßsî#Æï6ßî$‘ï6ßrî'ï6ßîï58î� îhîMî î!0î%íî'zî,7î.î0,î3Ëî5èî@kîAøîáï3‘ î¹îF î î"î ýï0¬þjxî ýï1î gï0¬þæî gï1î Mï0¬þXtî Mï1î ¥ï0¬þî ¥ï1î¹ï0¬þ¥î¹ï1î^ï0¬þyî^ï1îØï0¬þóîØï1îËï0¬þcîËï1î.ï0¬þ»î.ï1îéï0¬þ¥îéï1î�ï0¬þ»î�ï1rîJï1sîHï1îïï1rîÕï1î8ï1sî<ï1îÛï1rî ï1î âï1sî%ï1î%ïï1î'Ìrî*Ëï1î+§ï1 sî2˜ï1î3�ï1rî5wï1î7ï1î8‘sîDkï1îETï1rîGJï1sî1ï/nrîï/nsîyï/nrîîï/nîQï/nsî8ï/nî ï/nrî)ï/nî�ï/n sî'œï/nî(…ï/nrî*ï/nîï-Æ îÿî­î¨îhîï,îosîüï,îï,rîÊï,î-ï,î)Vîï*w sîï*wîï*wrîýï*wsîŠï*wî›ï*wrîíï*wîPï*wî*3sîï(Ðrîâï(ÐîEï(ÐsîBï(Ðî+ï(Ðî!rîÞï(ÐîAï(Ð sî ¯ï(Ðî!•ï(Ðrî"Ûï(Ðî#¢ï(Ðî/î0¦ sî9#ï(Ðî9Üï(Ðrî>Äï(Ðsîï'(rî›ï'(îbï'(î1îsîKï'(îï'(rîöï'(î½ï'( î%Ãî'O î-Çî/¬ sîï%�rî÷ï%�îZï%� î ýï"œþjxî ýï#î gï"œþæî gï#î Mï"œþXtî Mï#î ¥ï"œþçî ¥ï#î�ï"œþ»î�ï#îHï"œþyîHï#îÂï"œþóîÂï#îµï"œþcîµï#îï"œþ»îï#îÓï"œþ¥îÓï#îyï"œþ»îyï#rî4ï#sî2ï#îÙï#rî¾ï#î!ï#sî%ï#îÄï#rîðï#î Ìï#sî%ï#î%Ùï#î'µî.·rî1¶ï#î2“ï# sî9„ï#î:lï#rîZïìî>½ïì sî1ïErî<ïEîï� îÿî­î¨îhsîïörî›ïöîbïöî¦îÛîî°î-¤î.Ùsî0 ïöî0ÆïörsîïNîÐïNî’rîØïNî0ïNîï§ sîï§îˆï§rî“ï§sî ï§î1ï§rî„ï§îçï§î)Éð)sîïÿrîâïÿîEïÿsîBïÿî¬ïÿî¸rîtïÿî×ïÿ sî Fïÿî!,ïÿrîïXî"…î$ sî,�ïXî-IïXrî20ïXsîï °rî÷ï °îZï ° î ýï Ëþjxî ýï 5î gï Ëþæî gï 5î Mï ËþXtî Mï 5î ¥ï Ëþî ¥ï 5î¹ï Ëþ»î¹ï 5îtï Ëþ�îtï 5îï Ëþ°îï 5î´ï Ëþnî´ï 5î"ï Ëþ¥î"ï 5îÇï ËþçîÇï 5î¯ï Ëþ»î¯ï 5îjï Ëþyîjï 5îãï Ëþóîãï 5îÖï ËþcîÖï 5î9ï Ëþ»î9ï 5îõï Ëþ¥îõï 5îšï Ëþ»îšï 5rîVï 5sîSï 5îûï 5rîàï 5îCï 5sîGï 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.6rîïb& îÿî­î¨îhsîï`{rî›ï`{îbï`{î¦îÛîî°î-¤î.Ùsî0 ï`{î0Æï`{rsîï^ÏîÐï^Ïî’rîØï^Ïî0ï^Ïsîï]$rîâï]$îEï]$sîBï]$î¬ï]$î¸rîtï]$î×ï]$ð)sî0zï]$î1`ï]$rîï[x îRsî =ï[xî öï[xrî%Þï[xî ýïX�þjxî ýïXùî gïX�þæî gïXùî MïX�þXtî MïXùî ¥ïX�þóî ¥ïXùî™ïX�þ»î™ïXùîTïX�þ°îTïXùîïX�þ„îïXùî‰ïX�þ�î‰ïXùîïX�þóîïXùî ïX�þ›î ïXùî¥ïX�þ°î¥ïXùîVïX�þcîVïXùî¹ïX�þcî¹ïXùrîïXùsîïXùîÁïXùrî¦ïXùî ïXùsî ïXùî­ïXùrî ØïXùsî!¿ïXùî"“ïXùrî'°ïXùsî(ïXùrî+?ïXùîïWNsîÂïWNî{ïWNrîíïWNî ýïTeþjxî ýïTÏî gïTeþæî gïTÏî MïTeþXtî MïTÏî ¥ïTeþçî ¥ïTÏî�ïTeþ»î�ïTÏîHïTeþ°îHïTÏîøïTeþ îøïTÏîïTeþnîïTÏrî†ïTÏsî„ïTÏî+ïTÏrîïTÏîtïTÏsîxïTÏîïTÏrîBïTÏsî)ïTÏîýïTÏrî%ïTÏsî%~ïTÏrî(©ïTÏîïS#î îšîî ýïP;þjxî ýïP¤î gïP;þæî gïP¤î MïP;þXtî MïP¤î ¥ïP;þÜî ¥ïP¤î‚ïP;þcî‚ïP¤îåïP;þ»îåïP¤î ïP;þ�î ïP¤î0ïP;þ»î0ïP¤rîëïP¤sîéïP¤î�ïP¤rîuïP¤îÙïP¤sîÜïP¤î|ïP¤rî§ïP¤îïNùîúîêîZî\îÏî".î%Tî' î+}î0¿î2ƒî4ãî;9î?î@ÈîB¹îGlîáïMQî«î-î(òî,î.ñî3ðî7°î:Öî>¡î?ËîáïKª îÝî‹î ýïHÂþjxî ýïI+î gïHÂþæî gïI+î MïHÂþXtî MïI+î ¥ïHÂþþî ¥ïI+î£ïHÂþ¥î£ïI+îIïHÂþ�îIïI+îØïHÂþ¥îØïI+î}ïHÂþyî}ïI+rî÷ïI+sîôïI+îœïI+rî�ïI+îäïI+sîèïI+î‡ïI+rî²ïI+îïG€î� îPî5î î"Fî$c î,;î-Èî ýïD—þjxî ýïEî gïD—þæî gïEî MïD—þXtî MïEî ¥ïD—þóî ¥ïEî™ïD—þcî™ïEîüïD—þ»îüïEî·ïD—þ�î·ïEîFïD—þ¥îFïErîìïEsîéïEî‘ïErîvïEîÙïEsîÝïEî|ïErî§ïEî„ïEsî"œïEî#UïErî&1ïEsî'¾ïEî(wïErî+\ïEîïCUsî�ïCUîyïCUrîxïCUîïCUîpî–îîî#sî(î+ƒî/óî55î6ùî9Yî?¯îC�îE?îáïA®î”îCîªîÔî#’î'÷î)yî7œî:Âî?€îDIîáï@îHîî¹îþî€î(*î+Pî0Pî2î5³î9î?ßîAåîDEîGvîáï>_î\ îÈîSî¼ î%jî'pî)ûî-šî0Àî4ùî9î;Ôî?žîBIsîáï<¸î\rî£ï<¸îúï<¸î")î%²î)<î+Btî ìï9dî xî™ï9dîIï9dtîÖï9dî‡ï9dxî ýï6�tî Mï6�î ¥ï6�rîÆï6�sîÃï6�îkï6�rîPï6�î³ï6�sî·ï6�îVï6�rî�ï6�î ^ï6�sî#çï6�î$²ï6�rî'@ï6�îï4ñî� îhîMî‚sî¨ï4ñîaï4ñî"#rî#jï4ñî#Áï4ñî1ª î8„î:¡ îByîáï3J î¹î·îDîûî\î'ßî)Äî,Ôsî/úï3Jî0³ï3Jî4urî5¼ï3Jî6ï3Jxî ýï0Ëtî Mï0Ëî ¥ï0Ërîvï0Ësîtï0Ëîï0Ërîï0Ëîdï0Ësîhï0Ëîï0Ërî 2ï0Ësî!ï0Ëî!íï0Ërî' ï0Ëî'nï0Ësî*÷ï0Ëî+Âï0Ërî.Oï0Ëî.³ï0Ëîï/ îÿîï-tsî§ï-tîrï-trîiï-tîöï-tîÈsî(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 î4™xî ýïtî Mïî ¥ïrîïsîïîªïrî�ïîòïsîöïî•ïrî Àïsî!¨ïî"|ïrî'™ïsî'üïrî*ïîïXîÂxî ýïÙtî MïÙî ¥ïÙrîÎïÙsîËïÙîsïÙrîXïÙî»ïÙsî¿ïÙî^ïÙrî ‰ïÙî!fïÙsî&ïÙî&ƒïÙrî($ïÙîï.înî+î¸î÷îî: î%sî&Ÿï.î'°ï.rî)ï.î)fï. î1–î7’î:jî?Ùîáï‡î:îmî£î ÷ pî ìï_îÝqî ìï îîîÙîdîLuî ýï_îî�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î ýï`‚îÈwîwï`‚î'ï`‚uî³ï`‚î,ï`‚îÚî�î 6î#;î(4î."wî9þï`‚î:Éï`‚uî=ï`‚î=Àï`‚îAîBÄî Ðï^Úî¾î®îî¤îJîCî#2î&æî)Šî,Úî1î5Úî8sî:Çî>^îB>qî ìï\_î¾î¹îî…îÓî!î$Vî'euî ýïZ¸îß îØî}îî‹î!e î( î+kî.î1î3kî7þî:Jî?5îBîC¾î ÐïY îAî_î¿ î!"î%îî'“î)óî.¡î2£qî ìïV–î¾î¹îî…î±î >î#„î&“uî ýïTîî|î!îgî³î Ãî#²î&ûî(gî.,î0Ïî4î5„î7çî=­î?RîAŸ î ÐïSGîtîî1î} îØî!{ vî)ÈïöÿTVm$ÿ TIMESROMANþæÿ TIMESROMANþæÿ HELVETICAþŸÿ TIMESROMANþŸÿ TIMESROMANþŸÿ TIMESROMANþæÿLAURELþŸÿ TIMESROMANþŸÿ TIMESROMANþYF 4 Ù N& í3 Ç>ßAj/DBš–åÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ fileio.mesa 9-Mar-83 22:58:31