%systemroutinespec phex(%integer x)
%externalpredicatespec FS lookup(%string(31) what, %integername value)

%constinteger route slots = 32

%recordformat route fm(%integer network, mask, gateway, metric, stamp, via)
%recordformat route table fm(%record(route fm)%array e(1 : route slots))

%routine print INet address(%integer addr)
   write(addr >> 24 & 255, 0);  print symbol('.')
   write(addr >> 16 & 255, 0);  print symbol('.')
   write(addr >>  8 & 255, 0);  print symbol('.')
   write(addr       & 255, 0)
%end

%begin
   %record(route table fm)%name t
   %record(route fm)%name e
   %integer x
      %if FS lookup("INET_ROUTE_TABLE", x) %start
         t == record(x)
      %else
         printstring("No route table.");  newline
         %stop
      %finish
      %for x = 1, 1, route slots %cycle
         e == t_e(x)
         %if e_metric > 0 %start
            write(x, 2);  printstring(": net ");  print INet address(e_network)
            printstring(" mask ");  phex(e_mask)
            %if e_gateway = 0 %start
               printstring(" direct")
            %else
               printstring(" gateway ");  print INet address(e_gateway)
            %finish
            %if e_metric >= 16 %start
               %if e_metric < 32 %then printstring(" moribund") %c
                                 %else printstring(" dead")
            %else
               printstring(" metric ");  write(e_metric, 0)
            %finish
            printstring(" via ")
            %if e_via = 1 %start
               printstring("slow")
            %else %if e_via = 2
               printstring("fast")
            %else
               write(e_via, 0);  print symbol('?')
            %finish
            newline
         %finish
      %repeat
%end %of %program
