-- AddressImpl.mesa - edited by: -- Poskanzer 12-Sep-83 15:09:24 -- Bruce 19-Oct-83 14:43:18 -- Address is intended to be an easy-to-use interface to the various network address routines. StringsToNetworkAddress[] turns your strings into a network address, much like AddressTranslation.StringToNetworkAddress[]. NetworkAddressToString[] turns a network address back into a string. Both will raise AddressTrouble if anything goes wrong. DIRECTORY AddressTranslation USING [ BadSyntax, CHLookupProblem, OtherCHProblem, ScanError, StringToNetworkAddress], ExtendedString USING [AppendOctal, StringToNumber], Format USING [HostNumber, StringProc], String USING [ AppendChar, AppendOctal, AppendString, InvalidNumber, StringToNumber], System USING [NetworkAddress, nullSocketNumber, SocketNumber], Address USING []; AddressImpl: PROGRAM IMPORTS AddressTranslation, ExtendedString, Format, String EXPORTS Address = BEGIN AddressTrouble: PUBLIC ERROR [reason: LONG STRING] = CODE; StringsToNetworkAddress: PUBLIC PROCEDURE [ host: LONG STRING, socket: System.SocketNumber ← System.nullSocketNumber, net: LONG STRING ← NIL] RETURNS [addr: System.NetworkAddress] = BEGIN addrString: STRING = [200]; temp: STRING = [200]; fieldSize: CARDINAL = 4; invalidNumber: BOOLEAN; number: CARDINAL; field: ARRAY [0..fieldSize) OF CARDINAL; addrString.length ← 0; -- First the net number. temp.length ← 0; AppendWithoutDashes[temp, net]; invalidNumber ← FALSE; number ← String.StringToNumber[temp, 10 ! String.InvalidNumber => {invalidNumber ← TRUE; CONTINUE}]; IF NOT invalidNumber THEN BEGIN String.AppendOctal[addrString, number]; addrString.length ← addrString.length - 1; -- Get rid of the 'B since AddressTranslation barfs on it. END; String.AppendString[addrString, "."L]; -- Now the host - try interpreting it as a number, default base 10. temp.length ← 0; AppendWithoutDashes[temp, host]; IF Alphabetic[temp] THEN String.AppendString[addrString, host] ELSE { ExtendedString.StringToNumber[@field, fieldSize, 10, temp]; ExtendedString.AppendOctal[@field, fieldSize, addrString]}; String.AppendString[addrString, "."L]; addr ← AddressTranslation.StringToNetworkAddress[ addrString ! AddressTranslation.BadSyntax => ERROR AddressTrouble["Bad syntax."L]; AddressTranslation.CHLookupProblem => ERROR AddressTrouble["Clearinghouse lookup problem."L]; AddressTranslation.OtherCHProblem => ERROR AddressTrouble["Clearinghouse problem"L]; AddressTranslation.ScanError => ERROR AddressTrouble["Illegal character"L]].addr; addr.socket ← socket; END --StringsToNetworkAddress-- ; Alphabetic: PROC [s: STRING] RETURNS [BOOLEAN] = { char: CHARACTER; IF s.length = 0 THEN RETURN[TRUE]; char ← s[s.length-1]; SELECT char FROM 'H, 'h, 'X, 'x, IN['a..'f], IN['A..'F], IN ['0..'9] => NULL; ENDCASE => RETURN[TRUE]; FOR i: CARDINAL IN [0..s.length-1) DO c: CHARACTER = s[i]; SELECT c FROM IN['a..'f], IN['A..'F], IN ['0..'9] => NULL; ENDCASE => RETURN[TRUE]; ENDLOOP; RETURN[FALSE]}; NetworkAddressToString: PUBLIC PROCEDURE [ addr: System.NetworkAddress, proc: Format.StringProc] = BEGIN --NetworkAddressToString-- --!! should look up name in clearinghouse. Format.HostNumber[proc, addr.host, productSoftware]; END --NetworkAddressToString-- ; -- Internal procedures. AppendWithoutDashes: PROCEDURE [to: LONG STRING, from: LONG STRING] = BEGIN IF from # NIL THEN FOR i: CARDINAL IN [0..from.length) DO IF from[i] # '- THEN String.AppendChar[to, from[i]]; ENDLOOP; END; END.