DIRECTORY BcdDefs, BCDery, FS, IO, ListerUtils, Rope, TimeStamp; BCDeryImpl: CEDAR PROGRAM IMPORTS FS, IO, ListerUtils EXPORTS BCDery = BEGIN OPEN BCDery; EnumerateFiles: PUBLIC PROC [bcd: RefBCD _ NIL, bcdFileName: ROPE, to: PROC [name: ROPE, version: VersionStamp]] RETURNS [ferSure: RefBCD] = TRUSTED BEGIN fti: BcdDefs.FTIndex _ BcdDefs.FTIndex.FIRST; inStream: IO.STREAM _ FS.StreamOpen[bcdFileName, $read]; inner: PROC [ptr: LONG POINTER] = TRUSTED { tb: BcdDefs.Base = LOOPHOLE[ptr]; ssb: BcdDefs.NameString = LOOPHOLE[ptr + ferSure.ssOffset]; ftb: BcdDefs.Base = tb + ferSure.ftOffset; UNTIL fti = ferSure.ftLimit DO SELECT fti FROM BcdDefs.FTNull => NULL; BcdDefs.FTSelf => NULL; ENDCASE => { ftr: LONG POINTER TO BcdDefs.FTRecord = @ftb[fti]; name: ROPE = NameToRope[ftr.name, ssb]; to[name: name, version: ftr.version]}; fti _ fti + BcdDefs.FTRecord.SIZE; IF LOOPHOLE[fti, CARDINAL] > LOOPHOLE[ferSure.ftLimit, CARDINAL] THEN ERROR; ENDLOOP}; ferSure _ IF bcd # NIL THEN bcd ELSE ListerUtils.ReadBcd[bcdFileName]; ListerUtils.WithPages[inStream, ferSure, 0, ferSure.nPages, inner]; inStream.Close[]; END; NameToRope: PROC [n: BcdDefs.NameRecord, ssb: BcdDefs.NameString] RETURNS [ROPE] = TRUSTED { CharSeq: TYPE = RECORD[PACKED SEQUENCE COMPUTED CARDINAL OF CHAR]; ss: LONG POINTER TO CharSeq = LOOPHOLE[ssb]; index: CARDINAL = n+3; len: CARDINAL = ss[index]-0C; ros: IO.STREAM = IO.ROS[]; FOR i: NAT IN [index+1..index+len] DO IO.PutChar[ros, ss[i]]; ENDLOOP; RETURN [IO.RopeFromROS[ros]]; }; END. VBCDery>BCDeryImpl.Mesa Last Edited by: Spreitzer, March 1, 1984 9:06:04 pm PST Κ„˜Icode™K™7K™KšΟk œœœ˜@K˜šΠbx œœ˜Kšœœœ ˜Kšœ ˜—K˜Kšœœ˜K˜šΟnœœœœœœœœ˜”Kš˜Kšœ'œ˜-Kšœ œœœ ˜8š œœœœœ˜+Kšœœ˜!Kšœœ˜;Kšœ*˜*šœ˜šœ˜Kšœœ˜Kšœœ˜šœ˜ Kšœœœœ˜2Kšœœ˜'K˜&——Kšœœ˜"Kšœœœœœœœ˜LKšœ˜ ——Kš œ œœœœ"˜FKšœC˜CK˜Kšœ˜—K˜š Ÿ œœ2œœœ˜\Kšœ œœœœœœœœ˜BKš œœœœ œ˜,Kšœœ˜Kšœœ˜Kš œœœœœ˜šœœœ˜%Kšœ˜Kšœ˜—Kšœœ˜K˜—K˜Kšœ˜K˜—…—ξΘ