CensusFileReaderImpl.mesa
Copyright Ó 1992 by Xerox Corporation. All rights reserved.
Greene, June 25, 1990 3:38 pm PDT
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.