UserProfile.mesa;EditedbyTeitelmanonDecember16,198211:59amDIRECTORYRopeUSING[ROPE];UserProfile:CEDARDEFINITIONS=BEGINOverviewUserProfileisapackageforreadinginformationfromthediskfile.profile,orifnoneexists,User.profile.Thepurposeoftheprofileistoallowpersonalizedtailoringofthesystem.ThecurrentcatalogueofwaystheCedarcanbeparameterizedmaybefoundinthefileUserProfile.doc.Entriesintheuser'sprofileareoftheform::RETURN,wherevalueiseither(1)aBOOLEAN,(2)anINT,(3)aTOKEN,or(4)aListOfTokens(formoredetails,seeUserProfile.doc).WhenCedarisbooted,rolledBack,oranyfilewhoseextensionis"profile"isedited,theprofileisparsedandadatastructurewhichdescribestheinformationthatwasfoundintheprofileisconstructed.Comments(indicatedusingthestandard"--"convention)canappearanywhereintheprofileandwillbeignored.Theparsingwillalsoignoreextraspacesorblanklines.AnyerrorsoranomaliesdiscoveredwhenparsingoraccessingtheprofilewillcausediagnosticstobeprintedtothefileUserProfile.log.TheuserwillbeinformedthatproblemshavebeenencounteredviatheMessageWindow.Innocasehoweverwillthesystembreak.Accesstoindividualprofileentriesviatheproceduresbelowisrelativelyefficient,sincethisaccessdoesnotrequireanyfilereadsorparsing.Therefore,manysimpleapplicationscansimplyreadinformationfromtheprofileasneeded.However,someapplicationsderivecomplexdatastructuresfromtheprofile(considertheeffectofthe"UserCategory"profileentryonthestateofTioga),andhencecannotaffordtointerrogatetheprofilewheneversomeinformationderivedfromitisused.SuchanapplicationmustregisteraProfileChangedProcandperformallofitsprofileinterrogationsfromwithinthisprocedure.Thisguaranteesthatthecorrespondingvalueswillbeupdatedwhenevertheprofilechanges.TheProfileChangedProcwillbecalledwhenitisfirstregistered,wheneverthesystemisbootedorrolled-back,orwheneverafilewithextension".profile"issaved.Finepoint:SincetheProfileChangedProcforanapplicationisnotcalledfromthatapplication'sprocess(es),theapplicationmustexplicitlysynchronizeitsreadstovariablesderivedfromtheprofilewiththeProfileChangedProc'swritestothesevariables.Thismayinvolveaddingamonitortoanapplicationthatpreviouslydidnotrequireone.AccessingtheProfileTheproceduresdescribedbelowallreadsimpleresultsfromthevaluefieldgivenakey.Thedefaultvalueispassedinasanargumentsothattheclientcanspecifywhattheprocedurereturnsshouldthevaluebeabsentormalformed,ortheprofilebemissing.Boolean:PROC[key:Rope.ROPE,default:BOOLEAN_FALSE]RETURNS[value:BOOLEAN];Number:PROC[key:Rope.ROPE,default:INT_0]RETURNS[value:INT];Token:PROC[key:Rope.ROPE,default:Rope.ROPE_NIL]RETURNS[value:Rope.ROPE];returnsnexttokenfollowing:,i.e.effectivelydoesanIO.GetRope[IDBreak].Ifthefirstcharacterencounteredis",thenreadseverythingtothenextmatching",andreturnsthisasasinglerope.pî ìïaˆîÊîîëî!Hî#;î)‰î+Æî/ î2Ëqî ìï^'rî ýï\vqî²ï\vî˜ï\vrîáï\vqîDï\vrîUï\vî ýïZÆsî ìïWe rîïWeqîïWeîÞïWeîŽ rî“ïWeqî!xïWeî"2ïWesî ìïS7tî ìïOÜ î îyî�î¾îèîÊ î'@î*”î,àî/»î2î?%î@ÕîB#îE‚î ìïN5 îîîlîMîÕî#mî%î&Øî*ª î2¿î8`î:Bî<ÊîAÅîDÅî ìïL�îî¹îîuî�îî î(õî+øî-éî1÷î3¥î6uî8nïL�î9�ïL� tîA¤ïL�î ìïJ î�î/îîFî§îìî–î æî$¸î)vî-ŸïJ î.iïJ tî23ïJ î3ïJ î7 î:¥î<î?ßîA÷qîCïJ îCËïJ tîH²ïJ î ìïHbî &qî(ïHbî’ïHbtî4ïHbî#ïHbî\qî˜ïHbîRïHbtî·ïHbî¥ïHbî|îµîñ î'¡î*jî.î2Éî5/î?ÎîCùîH#î ìïF»îú îEî"îÜî_î!¦î'Ýî)bî/Lî0Ñî5qî7êîvîúîÙîòîIî¶ î' î)îî,^î1òî7éî9Éî;àî>ßîDsîG/î ìï<Ïîgî ìï:Kî]î î�îîsî!±î$ î+î/(î0• î6ˆ î<:î?­îBPîF_î ìï8£î dî0îÓî?îáî¨î!] î(î+åî0M î7çî:uî>çîB î ìï6üî Tîµî&îÕî÷î!-î$Á î,Yî0ˆî6 î9 î?VîB¾îEî ìï5Uîàî@î îÇî' î$2î(£î,8î.?î0Ÿî3Ñî5‹î:>î<öî@ïîElî ìï3­î   î–îûîpîªî#C î*Óî/Íî3:î4•î6î9 î=î? îF'î ìï2îäuî'ï2îï2tî²ï2îXï2îƒî$ôî&þî(Ðî*Äî/M î8î;œî?úîB´ î ìï0_î V îvî”îD î#Šî( î+î-Eî2ïî9sî<#î@ãîF·uî ìï.·tî@ï.·î>ï.·îÎî¡î{î"î#Kî$™î'T î-Ùî3ðî62î:�î;Þî@^îB î ìï-î °îäîîxî’î± î$Ùî&Eî*ëî.&î ìï*Œî ÍîXîøî`î!| î(ºî*Qî,òî1î4§î7¡ î?» îG/î ìï(ä îxîZ î» î#¿î&î*,î,Tî2‰î7÷î;Øî>±îC›îG/î ìï'=î-îî¾î 7 î&¯î)¹î,­î1qî5óî7 îåîAðîDæî ìïeî ¤îî“îPî î îEî!î#ôî&cî*2î,Ìî1wî4ãî7Qî=ãîB¥îG/î ìï¾î –î†îÖîš îøî¼î!î%‹î'|uî ýï]rîÛï]qîØï]î€ï]rîeï]îÈï]î×qî_ï]î3ï]rîpï]î Mï]qî%oï]î&(ï]rî+yï]qî-ï]î-¿ï]rî0¤ï]qî1qï]rî7bï]î7Åï]qî;èï]î<¡ï]rîAˆï]îAëï]uî ýïürîºïüqî·ïüî_ïürîDïüî§ïüî¶qî>ïüîïürîOïüî ,ïüqî%Nïüî%·ïürî'Ãïüî)Pïüqî*èïüî+¼ïürî0Ùïüî1<ïüqî5_ïüî5Éïürî7jïüî7Îïüuî ýï›rîÈï›qîÆï›îmï›rîRï›î¶ï›îÄqîMï›î ï›rî^ï›î:ï›î$\qî'äï›î(¸ï›rî+_ï›qî,ìï›î-Ôï›rî.÷ï›qî/Äï›rî5¶ï›î6ï›î:<qî=Äï›î>˜ï›rî@Õï›îA8ï›pîïëî¦î»î€îSî$î&D î,ˆî/Œî1î?yîAîCSîáï DîÌ îKî·îDî"Nî%× î,Tî-ùî0Eî3Zî9?î:Ìî=oîBîDŸîFXîáï œîº ¹TVm$eListOfTokens:PROC[key:Rope.ROPE,default:LISTOFRope.ROPE_NIL]RETURNS[value:LISTOFRope.ROPE];Forexample,ifyourprofilecontains:PreRun:Clock.bcd,VersionMapOpsImpl.bcd,HideousKludge.bcd,--justuntil3.4--WalnutSend.bcdthenListOfTOkens["PreRun"]willreturn("Clock.bcd","VersionMapOpsImpl.bcd","HideousKludge.bcd","WalnutSend.bcd).NotethatiftheuserprofilecontainsKey:{cr},thenListOfTokens["key",default]willreturnNIL,notdefault,i.e.theentryfor"key"isneithermalformedorabsent.Line:PROC[key:Rope.ROPE,default:Rope.ROPE_NIL]RETURNS[value:Rope.ROPE];LikeListOfTokensexceptreturnstheresultasasinglerope,e.g.foraboveexample,thevalueofLine["PreRun"]wouldbe"Clock.bcdVersionMapOpsImpl.bcdHideousKludge.bcdWalnutSend.bcd".GetProfileName:PROCRETURNS[Rope.ROPE];returnsnameoffileusedtobuildtheprofile,i.e.either.profile,orUserName.Profile.ReturnsNILifnoprofile.RegisteringproceduresforaccessingtheprofileAsmentionedabove,iftheresultofaccessingtheuserprofileisgoingtobecachedbytheclient,thentheprofileshouldnotbeaccesseddirectly,butviaaProfileChangedProcwhichhasbeenregisteredwithCallWhenProfileChanges.Thisguaranteesthatthecorrespondingvalueswillbeupdatedwhenevertheprofilechanges.Inotherwords,ratherthanwriting:ClientCheckpointFlag:BOOL_UserProfile.Boolean["ClientCheckpoint",TRUE];theimplementorshouldwrite:ClientCheckpointFlag:BOOL;Init:ProfileChangedProc={ClientCheckpointFlag_UserProfile.Boolean["ClientCheckpoint",TRUE];UserProfile.CallWhenProfileChanges[Init];CallWhenProfileChanges:PROC[proc:ProfileChangedProc];prociscalledwhenitisfirstregisteredwithreason=firstTime.ProfileChangedProc:TYPE=PROC[reason:ProfileChangeReason];ProfileChangeReason:TYPE={firstTime,rollBack,edit};ProfileChanged:PROC[reason:ProfileChangeReason];CallsalloftheProfileChangedProcs.Thisprocedureisautomaticallycalledafterarollback,whenevertheUserExec.Loginiscalled,orwhenevertheafilewithextension'profile'issavedbytioga.GetErrorLog:PRIVATEPROCRETURNS[fileName:Rope.ROPE];iftherewereanyerrorsreported,thisclosesthestreamandreturnsthenameofthefile.END.2uî ýïb& rî8ïb&qî6ïb&îÞïb&rîÃïb&î&ïb&î5qî½ïb&î ‘ïb&rî"Îïb&î#ªïb&qî(Ìïb&î)…ïb&î+±rî-±ïb&î.ºïb&qî19ïb&î2 ïb&rî4´ïb&qî6Aïb&î7)ïb&rî8Lïb&qî9ïb&rî? ïb&î?nïb&qîC‘ïb&îDJïb&îFvrî Ðï`qîXï`î,ï`rîiï`îÌï`pîï^Íî¤îWî­îÈîtî ýï\Hîs î)î'öî4—î5ôî8|î;ªî=Íî?+ pîïXïtîïXïîïXïpî ÇïXïî!¯ïXïî#\tî'oïXïî'éïXï î0îáïWHîüpî(ïWHîïSåîbî3îŠîÖîºîóî$Hî*gî-qî:-î?îA¯îEÂîáïR>îEîîNîšîî :î$&î%’î*î0Ñî2Šuî ýïNÛrî¨ïNÛqî¦ïNÛîMïNÛrî3ïNÛî–ïNÛî¤qî-ïNÛîïNÛrî>ïNÛîïNÛî#<qî&ÄïNÛî'˜ïNÛrî*?ïNÛqî+ÌïNÛî,µïNÛrî-ØïNÛqî.¥ïNÛrî4–ïNÛî4ùïNÛî9qî<¤ïNÛî=xïNÛrî?µïNÛî@ïNÛpîïM*îK îØîî"¬î$øî(°î*iî+žî/vî2Óî5Sî7zî;Fî@ùîCEîFÏtîáïK‚ pîÕïK‚î¼ïK‚îÁtî‘ïK‚îAïK‚î%¸î5GîáïIÛuî ÐïF} rî€ïF}qî~ïF}î%ïF}î rî üïF}î!_ïF}qî$çïF}î%»ïF}rî'øïF}î([ïF}pîïDÌî¦îJîíîAîRî÷î"_î$«î)=î+oî/>î;ìî=¥îáïC%îòîînîasî ìï>õ îš îßî�î$Êî'¢tî ìï;™î îâîBî¨î îÝî œî&‰î(îî+ìî0bî1Óî5£î7Vî9Mî=åî?æîBKîFiî ìï9ñî Dî¬î î�îvîèî$.î&§î(Ýuî)ÿï9ñî*æï9ñtî6iï9ñî7fï9ñî:oî<Üî@1 îFtuî ìï8JtîÒï8JîÇï8Jîû î#äî&Ìî)F î2Vî6žî9cî;mî@áîG/î ìï6£î\î ìï4î »îZî¿îÍîóî ìï1™qîï1™î½ï1™tî™ï1™î&ï1™ð'qî6-ï1™î6æï1™tî9Yï1™î9¼ï1™pî ýï.6îI î îOtî ìï+±qîï+±î½ï+±tî/ï+±î ìï),î î{î`î)®î+;ð'qîDCï),îDüï),tîGoï),îGÒï),î ìï&¦ð)uî ýï#Drîãï#Dqîáï#Dîˆï#Drîmï#DîÑï#Dî#ppîï!’îî~î_îáî9î¤îs î%‰tî(…ï!’î) ï!’î,ßî.Äpî41ï!’uî ýï/rîêï/qîèï/î¡ï/rî?ï/qî$ï/îÌï/rî!±ï/î"ï/î&çuî ýïÍrîÇïÍqîÄïÍî}ïÍrîïÍîïÍ î%ûî+Àuî ýïj rîïjqîïjîÃïjrî¨ïjî ïjîßpîï¸î‹î†î*tîvï¸îGï¸pî#êï¸î$Æï¸î'Öî.î/m î7Ðî;±î>äî@îáïî¸tîïî#ï pî!ïî!eïî"mî&§î(`î.6î0‚î1·î4 î7î= îA÷îCbîGîáïjuî ýï rî²ïqî°ïîXïîîœrî#Žïî#ñïî*kqî-óïî.Çïrî1ïî1gïpîï UîeîÐîöîŽîoî" î$¤î(zî*Æî/$î1Èî6_î8«î