DIRECTORY BlackCherry, DFS, Icons, IO, RefText, Rope, UFS; BlackCherryUFSImpl: CEDAR PROGRAM IMPORTS BlackCherry, DFS, Icons, IO, RefText, Rope, UFS = BEGIN OPEN BlackCherry; ROPE: TYPE ~ Rope.ROPE; STREAM: TYPE ~ IO.STREAM; localStreamOptions: UFS.StreamOptions ¬ [ tiogaRead: FALSE, truncatePagesOnClose: FALSE, closeUFSOpenFileOnClose: TRUE ]; UFSFullName: PROC [ fileName: ROPE, wDir: ROPE ¬ NIL ] RETURNS [ fullName: ROPE ] ~ { BEGIN ENABLE UFS.Error => { Report["\n***UFS.Error: %g\n", [rope[error.explanation]] ]; IF error.code = $illegalName THEN GOTO tryAgain ELSE GOTO Bogus }; fullName ¬ UFS.ExpandName[fileName, wDir].fullUName; EXITS Bogus => { ERROR BadName }; tryAgain => NULL; END; BEGIN BEGIN ENABLE UFS.Error => { Report["\n***UFS.Error: %g\n", [rope[error.explanation]] ]; GOTO Bogus2 }; temp: REF TEXT ¬ RefText.ObtainScratch[RefText.line]; temp.length ¬ 0; FOR i: INT IN [0..fileName.Length[]) DO c: CHAR ~ fileName.Fetch[i]; IF (c = ' ) OR ( c = '\t ) THEN LOOP; [] ¬ RefText.AppendChar[temp, c]; ENDLOOP; fileName ¬ Rope.FromRefText[temp]; RefText.ReleaseScratch[temp]; fullName ¬ UFS.ExpandName[fileName, wDir].fullUName; EXITS Bogus2 => { ERROR BadName }; END; END; }; UFSFileOpenOrCreate: PROC [ name: ROPE, how: ATOM ] RETURNS [ fileData: BCFileData] ~ { fileData ¬ NEW[BCFileDataRec ¬ [name: name] ]; IF how = $create THEN { fileData.writeStream ¬ UFS.StreamOpen[fileData.name, $create, UFS.binaryStreamOptions ]; fileData.writeStream.Close[]; }; fileData.writeStream ¬ UFS.StreamOpen[fileData.name, $write, UFS.binaryStreamOptions ]; fileData.readStream ¬ fileData.writeStream; }; UFSSetByteCount: PROC [ fileData: BCFileData, bytes: INT ] ~ { fileData.writeStream ¬ UFS.StreamOpen[fileData.name, $write, UFS.binaryStreamOptions ]; fileData.writeStream.SetLength[bytes]; fileData.writeStream.Close[]; fileData.writeStream ¬ NIL; }; UFSIconSetter: PROC[iconFileName: ROPE] = { BlackCherry.msgSetIcon ¬ Icons.NewIconFromFile[iconFileName, 1 ! DFS.Error => { GOTO notFound }]; BlackCherry.msgIcon ¬ Icons.NewIconFromFile[iconFileName, 2]; EXITS notFound => NULL; }; Init: PROC = { procs: BlackCherry.FileProcs ¬ NEW[BlackCherry.FileProcsRec ¬ [ fullName: UFSFullName, openOrCreate: UFSFileOpenOrCreate, setByteCount: UFSSetByteCount, iconSetter: UFSIconSetter ] ]; BlackCherry.RegisterFileProcs[procs]; }; Init[]; END. 6BlackCherryUFSImpl.mesa Copyright Σ 1989, 1992 by Xerox Corporation. All rights reserved. Willie-Sue, November 28, 1989 4:25:41 pm PST Bill Jackson (bj) July 19, 1989 6:38:17 pm PDT Initial PCedar version try getting rid of spaces and tabs in the name Report["%g of %g\n", [atom[how]], [rope[name]] ]; ΚΡ–(cedarcode) style•NewlineDelimiter ˜šœ™Icodešœ Οeœ7™BK™,K™.K™—šΟk ˜ Kšœ ˜ Kšžœ˜K˜Kšžœ˜K˜Kšœ˜Kšžœ˜K˜—šΟbœžœž˜!šž˜Kšœ žœ žœž˜/—K˜Kšœžœžœ ˜K˜Kšžœžœžœ˜Kšžœžœžœžœ˜headšΟz™šœžœ˜)Kšœ žœ˜Kšœžœ˜Kšœž˜Kšœ˜—K˜šΟn œžœ žœžœžœžœ žœ˜Ušžœžœžœ ˜Kšœ;˜;Kš žœžœžœ žœžœ˜?Kšœ˜—Kšœ žœ&˜4šž˜Kšœ žœ ˜Kšœ žœ˜Kšžœ˜—K™.šž˜šžœžœžœIžœ ˜gKšœžœžœ'˜5K˜šžœžœžœž˜'Kšœžœ˜Kšžœ žœ žœžœ˜'K˜!Kšžœ˜—K˜"Kšœ˜Kšœ žœ&˜4šž˜Kšœ žœ ˜—Kšžœ˜—Kšžœ˜—K˜K˜—š ‘œžœ žœžœžœ˜WKšœ žœ ˜.Kšœ1™1šžœžœ˜Kšœžœ$žœ˜XKšœ˜K˜—Kšœžœ#žœ˜WK˜K˜+K˜K˜—š‘œžœ žœ˜>Kšœžœ#žœ˜WKšœ&˜&Kšœ˜Kšœžœ˜K˜K˜—š‘ œžœžœ˜+KšœAžœ žœ ˜aK˜=šž˜Kšœ žœ˜—Kšœ˜K˜—š‘œžœ˜šœžœ˜?Kšœ˜Kšœ"˜"Kšœ˜Kšœ˜K˜—Kšœ%˜%K˜K˜—K˜—K˜Kšžœ˜K˜—K˜—…— <C