! INet name/address conversion

%conststring(31) database = "INet:INetAddrs.Dat"

%systemroutinespec phex(%integer x)

! Useful procedures

%routine read address(%integername a)
   %integer n
      ! Skip comments
      %cycle
         %exit %unless next symbol = '#'
         skip symbol %while next symbol # NL;  skip symbol
      %repeat
      ! Read the address
      a = 0
      read(n)
      %while next symbol = '.' %cycle
         skip symbol
         a = a << 8 ! n
         read(n)
      %repeat
      a = a << 8 ! n
%end

%routine read name(%string(*)%name name)
   %integer ch
      name = ""
      ! Skip blank space
      skip symbol %while next symbol <= ' ' %and next symbol # NL
      ! Comment or end of line?
      %return %if next symbol = '#' %or next symbol = NL
      ! Read the name
      %cycle
         ch = next symbol
         %return %if ch <= ' ' %or ch = '#'
         ch = ch - 'A' + 'a' %if 'A' <= ch <= 'Z'
         name = name . to string(ch)
         skip symbol
      %repeat
%end


! Translate INet address to name.

%string(31)%fn INet address to name(%integer address)
   %integer in, opened = 0, current address
   %string(31) name
      %on 3, 9 %start
         %if opened # 0 %start
            close input
            select input(in)
         %finish
         %result = ""
      %finish
      !! printstring("Looking for ");  phex(address);  newline
      in = in stream
      open input(3, database);  select input(3)
      opened = 1
      !! printstring("Opened");  newline
      %cycle
         read address(current address)
         !! printstring("Trying ");  phex(current address);  newline
         %if current address = address %start
            read name(name)
            close input;  select input(in)
            %result = name
         %finish
         skip symbol %while next symbol # NL;  skip symbol
      %repeat
%end

%integerfn INet name to address(%string(31) name)
   %string(31) current name
   %integer i, current address, in, opened = 0
   %bytename x
      %on 3, 9 %start
         %if opened # 0 %start
            close input
            select input(in)
         %finish
         %result = 0
      %finish
      %result = 0 %if name = ""
      %for i = 1, 1, length(name) %cycle
         x == charno(name, i)
         x = x - 'A' + 'a' %if 'A' <= x <= 'Z'
      %repeat
      !! printstring("Looking for ");  printstring(name);  newline
      in = in stream
      open input(3, database);  select input(3)
      opened = 1
      !! printstring("Opened");  newline
      %cycle
         read address(current address)
         !! printstring("Trying ");  phex(current address);  newline
         %cycle
            read name(current name)
            %exit %if current name = ""
            %if current name = name %start
               close input;  select input(in)
               %result = current address
            %finish
         %repeat
         skip symbol %while next symbol # NL;  skip symbol
      %repeat
%end

%end %of %file
