!************************************************************************
!*                                                                      *
!* Program to munge text name-server table NS.TXT to binary form NS.DAT *
!* NS.DAT is used by INVENTY to produce APM inventory and by WHATIS.    *
!*                                                                      *
!*                  Version 1.3    4 May 1988                           *
!*                                                                      *
!************************************************************************

!8/12/87: Use char 1 of NS.TXT as a server (A,B,C,D,M) and generates
!1/5/88: Add Inet addresses and names
! modified NS recordformat (inon and room merged, new bootfs field)
%include "inc:util.imp"
%begin
%include "nsdefs.inc"
%include "ie:sysdep.inc"
%integer i, l, j
%constinteger max = 16_56
%string (255) s, comment
%record (ns lfm) lf
%recordformat f(%string (4) add, inet, case, %string (8) sname,
                %byte io, rm, bootfs, 
                %string (31) iname, lname, %string (18) bpmap)
%record (f) %array t(0:max)

%routine printfield(%string (255) s, %integer l)
   printstring (s)
   spaces(l-length(s)) %if l > length(s)
%end


%routine reads(%string (*) %name s, %integer l)
   %integer i, c
   s = ""
   %if l > 0 %start
      %for i = 1, 1, l %cycle
         readsymbol(c)
         s = s.tostring(c)
      %repeat
   %else
      l = -l
      %cycle
         readsymbol(c)
         %exit %if c < ' ' %or length(s) = l
         s = s.tostring(c)
      %repeat
   %finish
   s = s." " %while length(s) < l
   length(s) = l
%end

s = cliparam; s = "ns.txt" %if s = ""
open input(1, s); selectinput(1)
readline(comment) ;!Date and update info.
printline(comment)

%for i = 0, 1, max %cycle
   readsymbol(t(i)_bootfs); skipsymbol; skipsymbol; skipsymbol
   reads(t(i)_inet, 2); skipsymbol
   reads(t(i)_case, 3); skipsymbol
   reads(t(i)_sname, 8); skipsymbol; reads(t(i)_add, 4); skipsymbol
   reads(t(i)_bpmap, 18); skipsymbol
   readsymbol(t(i)_io); readsymbol(t(i)_rm); skipsymbol; 
   reads(t(i)_iname, 12); reads(t(i)_lname, -31)
   %if t(i)_io = 'A' %start
     t(i)_io = ns at
   %elseif t(i)_io = 'O'
     t(i)_io = ns on
   %elseif t(i)_io = 'I'
     t(i)_io = ns in
   %else
     t(i)_io = ns blank
   %finish

   %if t(i)_rm = 'T' %start
     t(i)_rm = ns the
   %elseif t(i)_rm = 'R'
     t(i)_rm = ns room
   %else
     t(i)_rm = ns blank
   %finish
%repeat

!Now write out the file
open output(1, "ns.dat"); selectoutput(1)
!Put all the short names as a quick reference at the front of the file
!(128 * 8 bytes)
%for i = 0, 1, max %cycle
   printstring(t(i)_sname)
%repeat

!Then write out all the long records (128 * 64 bytes)
%for i = 0, 1, max %cycle
   lf = 0
   lf_inonrm = (t(i)_io)<<4+(t(i)_rm)&15                  { 1: IN/ON/AT}
   lf_bootfs = t(i)_bootfs                                { 1: Boot filestore}
   %if t(i)_case = "???" %then lf_case = 0 %else lf_case = stoi(t(i)_case)
   %if t(i)_inet = "?" %then lf_inet=0 %else lf_inet = stoi(t(i)_inet)
   bulk move(7,  charno(t(i)_iname, 1), lf_iname(1))      { 7: Inet name}
   bulk move(31, charno(t(i)_lname, 1), lf_lname(1))      {31: long name}
   bulk move(4,  charno(t(i)_add, 1),   lf_add(1))        { 4: Location}
   bulk move(18, charno(t(i)_bpmap, 1), lf_bpmap(1))      {18: Peripheral list}
   !                                        Total         {64}
   %for j = 0, 1, sizeof(lf)-1 %cycle
      printsymbol(byteinteger(addr(lf)+j))
   %repeat
%repeat
printsymbol(length(comment)); printstring(comment); spaces(255-length(comment))
%endofprogram

