<> <> <> <> <> DIRECTORY IO, Rope USING [ Cat, Concat, Equal, Fetch, Length, MakeRope, ROPE, Substr], ThNet ; WhitePagesImpl: CEDAR PROGRAM IMPORTS IO, Rope EXPORTS ThNet = { ROPE:TYPE=Rope.ROPE; localPrefix: ROPE = "8923"; localDDDPrefix: ROPE = "9415"; intelnetPause: ROPE _ "\017"; lpLen: NAT = 4; sp: REF IO.StreamProcs = IO.CreateStreamProcs[ variety: input, class: $Undecorate, getChar: UndecorateChar ]; HowToDial: PUBLIC PROC[phoneNumber: ROPE, ownExtension: ROPE] RETURNS [whatToDial: ROPE, isLocalExtension: BOOLEAN] = { phoneNumber _ IO.GetLineRope[IO.CreateStream[sp,NIL,IO.RIS[phoneNumber]]!IO.EndOfStream=>{ phoneNumber_NIL; CONTINUE; }]; <> SELECT phoneNumber.Length[] FROM 7, 10 => phoneNumber _ Rope.Concat["9", phoneNumber]; ENDCASE; IF phoneNumber.Substr[len: lpLen].Equal[localPrefix] THEN RETURN [phoneNumber.Substr[start: lpLen], TRUE] ELSE IF phoneNumber.Substr[len: lpLen].Equal[localDDDPrefix] THEN RETURN [Rope.Concat["9", phoneNumber.Substr[start: lpLen]], TRUE] ELSE IF phoneNumber.Length[] >= 8 AND phoneNumber.Fetch[0] = '8 THEN <> <<(Any very small characters in a phone number are interpreted as 100 ms. pause intervals)>> RETURN[ Rope.Cat["8", intelnetPause, phoneNumber.Substr[start: 1], intelnetPause, ownExtension], FALSE] ELSE RETURN [phoneNumber, phoneNumber.Length[]<6]; }; UndecorateChar: PROC[self: IO.STREAM] RETURNS[CHAR] = { DO c: CHAR=self.backingStream.GetChar[]; IF c IN ['0..'9] THEN RETURN[c]; ENDLOOP; }; FeepName: PUBLIC PROC[rName: ROPE] RETURNS[feepName: ROPE] = { RETURN[Rope.MakeRope[base: rName, size: rName.Length[], fetch: FeepFetch]]; }; FeepFetch: PROC[data: REF, index: INT] RETURNS [c: CHAR] = { c_NARROW[data, ROPE].Fetch[index]; IF c IN ['A..'Z] THEN c_c+('a-'A); IF c NOT IN ['a..'z] THEN c_'z+1; RETURN[FeepMap[c]]; }; FeepMap: PACKED ARRAY CHAR['a..'z+1] OF CHAR = [ '2, '2, '2, '3, '3, '3, '4, '4, '4, '5, '5, '5, '6, '6, '6, '7, '7, '7, '7, '8, '8, '8, '9, '9, '9, '9, '1 ]; }.