DIRECTORY FS, IO, CensusFileReader, RefText, Rope; CensusFileReaderImpl: CEDAR PROGRAM IMPORTS FS, IO, RefText, Rope EXPORTS CensusFileReader = BEGIN OPEN CensusFileReader; IntOutOfBuffer: PROC [b: REF TEXT, start: NAT ¬ 0, len: NAT ¬ NAT.LAST] RETURNS [i: INT ¬ 0] ~ { anyThingFound: BOOL ¬ FALSE; sign: INT ¬ 1; FOR p: NAT IN [start..start+len) DO c: CHAR ¬ RefText.Fetch[b, p]; ci: INT ¬ ORD[c] - ORD['0]; IF (ci >= 0) AND (ci <= 9) THEN {i ¬ i*10 + ci; anyThingFound ¬ TRUE; LOOP}; IF (c = ' ) AND anyThingFound THEN EXIT; IF (c = '- ) THEN sign ¬ -1; ENDLOOP; i ¬ i*sign; }; GetDIME: PUBLIC PROC [fileName: Rope.ROPE, perLine: PerLineProc] ~ { fromFile: IO.STREAM ¬ FS.StreamOpen[fileName: fileName, streamOptions: options]; fP: INT; filePosition: GetIntProc ~ {RETURN[fP]}; stPreDir: GetRopeProc ~ {RETURN[Rope.FromRefText[buffer, 0, 2]]}; stName: GetRopeProc ~ {RETURN[Rope.FromRefText[buffer, 2, 20]]}; stType: GetRopeProc ~ {RETURN[Rope.FromRefText[buffer, 22, 4]]}; stSufDir: GetRopeProc ~ {RETURN[Rope.FromRefText[buffer, 26, 2]]}; nonStCo: GetRopeProc ~ {RETURN[Rope.FromRefText[buffer, 28, 1]]}; leftAdd1: GetRopeProc ~ {RETURN[Rope.FromRefText[buffer, 56, 6]]}; leftAdd2: GetRopeProc ~ {RETURN[Rope.FromRefText[buffer, 62, 6]]}; rgtAdd1: GetRopeProc ~ {RETURN[Rope.FromRefText[buffer, 68, 6]]}; rgtAdd2: GetRopeProc ~ {RETURN[Rope.FromRefText[buffer, 74, 6]]}; zipCoLef: GetIntProc ~ {RETURN[IntOutOfBuffer[buffer, 103, 5]]}; zipCoRgt: GetIntProc ~ {RETURN[IntOutOfBuffer[buffer, 108, 5]]}; fmNode: GetIntProc ~ {RETURN[IntOutOfBuffer[buffer, 122, 4]]}; toNode: GetIntProc ~ {RETURN[IntOutOfBuffer[buffer, 126, 5]]}; fromLat: GetIntProc ~ {RETURN[IntOutOfBuffer[buffer, 204, 6]]}; fromLong: GetIntProc ~ {RETURN[IntOutOfBuffer[buffer, 210, 7]]}; toLat: GetIntProc ~ {RETURN[IntOutOfBuffer[buffer, 217, 6]]}; toLong: GetIntProc ~ {RETURN[IntOutOfBuffer[buffer, 223, 7]]}; copyRecord: CopyRecordProc ~ {IO.PutBlock[to, buffer, 0, 300]}; buffer: REF TEXT ¬ NEW[TEXT[300]]; [] ¬ IO.GetBlock[fromFile, buffer, 0, 300]; -- throw away header record UNTIL fromFile.EndOf[] DO fP ¬ IO.GetIndex[fromFile]; [] ¬ IO.GetBlock[fromFile, buffer, 0, 300]; IF perLine[filePosition, stPreDir, stName, stType, stSufDir, nonStCo, leftAdd1, leftAdd2, rgtAdd1, rgtAdd2, zipCoLef, zipCoRgt, fmNode, toNode, fromLat, fromLong, toLat, toLong, copyRecord] THEN EXIT; ENDLOOP; fromFile.Close[]; }; GetDIMERecord: PUBLIC PROC [fileStream: IO.STREAM, postion: INT, perLine: PerLineProc] ~ { filePosition: GetIntProc ~ {RETURN[postion]}; stPreDir: GetRopeProc ~ {RETURN[Rope.FromRefText[buffer, 0, 2]]}; stName: GetRopeProc ~ {RETURN[Rope.FromRefText[buffer, 2, 20]]}; stType: GetRopeProc ~ {RETURN[Rope.FromRefText[buffer, 22, 4]]}; stSufDir: GetRopeProc ~ {RETURN[Rope.FromRefText[buffer, 26, 2]]}; nonStCo: GetRopeProc ~ {RETURN[Rope.FromRefText[buffer, 28, 1]]}; leftAdd1: GetRopeProc ~ {RETURN[Rope.FromRefText[buffer, 56, 6]]}; leftAdd2: GetRopeProc ~ {RETURN[Rope.FromRefText[buffer, 62, 6]]}; rgtAdd1: GetRopeProc ~ {RETURN[Rope.FromRefText[buffer, 68, 6]]}; rgtAdd2: GetRopeProc ~ {RETURN[Rope.FromRefText[buffer, 74, 6]]}; zipCoLef: GetIntProc ~ {RETURN[IntOutOfBuffer[buffer, 103, 5]]}; zipCoRgt: GetIntProc ~ {RETURN[IntOutOfBuffer[buffer, 108, 5]]}; fmNode: GetIntProc ~ {RETURN[IntOutOfBuffer[buffer, 122, 4]]}; toNode: GetIntProc ~ {RETURN[IntOutOfBuffer[buffer, 126, 5]]}; fromLat: GetIntProc ~ {RETURN[IntOutOfBuffer[buffer, 204, 6]]}; fromLong: GetIntProc ~ {RETURN[IntOutOfBuffer[buffer, 210, 7]]}; toLat: GetIntProc ~ {RETURN[IntOutOfBuffer[buffer, 217, 6]]}; toLong: GetIntProc ~ {RETURN[IntOutOfBuffer[buffer, 223, 7]]}; copyRecord: CopyRecordProc ~ {IO.PutBlock[to, buffer, 0, 300]}; buffer: REF TEXT ¬ NEW[TEXT[300]]; IO.SetIndex[fileStream, postion]; [] ¬ IO.GetBlock[fileStream, buffer, 0, 300]; -- throw away header record [] ¬ perLine[filePosition, stPreDir, stName, stType, stSufDir, nonStCo, leftAdd1, leftAdd2, rgtAdd1, rgtAdd2, zipCoLef, zipCoRgt, fmNode, toNode, fromLat, fromLong, toLat, toLong, copyRecord]; }; FilterDIME: PUBLIC PROC [from: Rope.ROPE, to: Rope.ROPE, smallLat, smallLong, largeLat, largeLong: INT] ~ { toFile: IO.STREAM ¬ FS.StreamOpen[to, $create]; Check: PerLineProc ~ { IF (fromLat[] >= smallLat) AND (fromLong[] >= smallLong) AND (fromLat[] < largeLat) AND (fromLong[] < largeLong) THEN copyRecord[toFile]; }; buffer: REF TEXT ¬ NEW[TEXT[300]]; IO.PutBlock[toFile, buffer, 0, 300]; GetDIME[from, Check]; toFile.Close[]; }; options: FS.StreamOptions ¬ FS.defaultStreamOptions; options[tiogaRead] ¬ FALSE; END. € CensusFileReaderImpl.mesa Copyright Σ 1992 by Xerox Corporation. All rights reserved. Greene, June 25, 1990 3:38 pm PDT ΚΓ•NewlineDelimiter –(cedarcode) style™J™xIcode˜KšΟk œœœ#˜3KšΟnœœœœœœœ˜]K˜Kšœœ˜K˜K˜šžœœœœ œ œœœœœ ˜`Kšœœœ˜Kšœœ˜šœœœ˜#Kšœœ˜Kšœœœœ˜Kš œ œ œ!œœ˜LKšœ œœœ˜*Kšœ œ ˜Kšœ˜—K˜ K˜—K˜šžœœœœ˜DKšœ œœœ8˜PKšœœ˜K˜Kšœœ˜(K˜Kšœœ"˜AKšœœ#˜@Kšœœ#˜@Kšœœ#˜BKšœœ#˜AKšœœ#˜BKšœœ#˜BKšœœ#˜AKšœœ#˜AKšœœ"˜@Kšœœ"˜@Kšœœ"˜>Kšœœ"˜>Kšœœ"˜?Kšœœ"˜@Kšœœ"˜=Kšœœ"˜>Kšœœ˜?K˜Kš œœœœœ˜"K˜Kšœœ&Οc˜HK˜šœ˜Kšœœ˜Kšœœ$˜+KšœΌœœ˜ΘKšœ˜—K˜K˜—K˜š ž œœœœœ œ˜ZK˜Kšœœ ˜-K˜Kšœœ"˜AKšœœ#˜@Kšœœ#˜@Kšœœ#˜BKšœœ#˜AKšœœ#˜BKšœœ#˜BKšœœ#˜AKšœœ#˜AKšœœ"˜@Kšœœ"˜@Kšœœ"˜>Kšœœ"˜>Kšœœ"˜?Kšœœ"˜@Kšœœ"˜=Kšœœ"˜>Kšœœ˜?K˜Kš œœœœœ˜"K˜Kšœ˜!Kšœœ(Ÿ˜JK˜K˜ΐK˜—K˜š ž œœœ œ œ,œ˜kKšœœœœ˜/šžœ˜Kš œœœœœ˜ŠK˜—Kš œœœœœ˜"Kšœ"˜$Kšœ˜K˜K˜—K˜Kšœ œœ˜4K˜Kšœœ˜K˜Kšœ˜—…—ΰ#