{       INI FILE MODULE FOR RNO TO TEX CONVERSION           }
{       RANDALL VENHOLA JULY 7, 1987                        }

[INHERIT('UTILITYOPS','BASICFILEOPS','ARGOPS',
        'TREEANDLISTOPS','SCREENHANDLERS'), environment('iniops')]

MODULE INIOPS;



[GLOBAL] PROCEDURE readarglistfromini( var ini : text; var index : integer;
                                 var list : arglist );
const
 iniseparator = '$';
var
 s : pckstr;
 done : boolean;
 gotten : boolean;
 arg : argument;
 inserted : boolean;

 function endofline : boolean;
 begin
   if eof(ini) then
      endofline := true
   else
      begin
        if eoln(ini) then
           endofline := true
        else
          begin
            if ini^ = blank then
               endofline := true
            else
               endofline := false
          end
      end
 end;

 function atseparator : boolean;
 begin
   atseparator := (ini^ = iniseparator)
 end;

 procedure readpckstr( var s : pckstr; var gotten : boolean );
 var
   ch : char;
   done : boolean;
   charindex : integer;
 begin
   s.body := blank;
   done := false;
   charindex := 0;
   repeat
       if endofline then
           done := true
       else
         if atseparator then
            done := true
         else
            if charindex = maxchars then
            begin
               warningmessage('readini','ini file argument size overflow');
               done := true
            end
            else
            begin
               read(ini, ch);
               charindex := charindex + 1;
               s.body[charindex] := ch
            end;
        s.length := charindex
   until done;
   gotten := charindex > 0;
   if atseparator then read(ini, ch)
 end;

 procedure readindex(var index : integer; var gotten : boolean );
 const
   ndigits = 3;
 var
   count : integer;
   ch    : char;
 begin
   gotten := true;
   count := 0;
   index := 0;
   repeat
       if endofline then
           gotten := false
       else
         if count < ndigits then
         begin
            read(ini, ch);
            count := count + 1;
            if ch in ['0'..'9'] then
               index := index*10 + ord(ch) - ord('0')
            else
            begin
               warningmessage('readini','bad index digits in INI');
               gotten := false
            end
         end
    until (not gotten) or (count = ndigits);
    if (gotten) and (not eof(ini)) then read(ini, ch)
 end;

 procedure pckstrtoarg( s : pckstr; index : integer; var arg : argument);
 label
     routineexit;
 begin
    initarg(arg, [dsrverb], s, index, false );
    if s = '[N]' then
    begin
      reassignargclass(arg, [int,signedint,nulltype]);
      reassignarggeneralization(arg, true);
      goto routineexit
    end;
    if s = '[Y]' then
    begin
      reassignargclass(arg, [stylespecifier]);
      reassignarggeneralization(arg, true);
      goto routineexit
    end;
    if s = '[T]' then
    begin
      reassignargclass(arg, [textpckstr,character,nulltype]);
      reassignarggeneralization(arg, true);
      goto routineexit
    end;
    if s = '[C]' then
    begin
      reassignargclass(arg, [character,nulltype]);
      reassignarggeneralization(arg, true);
      goto routineexit
    end;
    if s = '[Q]' then
    begin
      reassignargclass(arg, [quotedpckstr,nulltype]);
      reassignarggeneralization(arg, true);
      goto routineexit
    end;
    routineexit : nullstatement
 end;

begin {readarglistfromini}
 list := nulllist;
 readindex(index, gotten );
 if gotten then
 begin
   if index < 1 then
     warningmessage('readini','bad INI index value');
   repeat
      readpckstr(s, gotten );
      if gotten then
      begin
        pckstrtoarg(s, index, arg );
        appendargonlist(list, arg);
      end
   until not gotten;
   if arglistlength(list) = 0 then
      warningmessage('readini','empty argument list in INI file')
 end
 else
 begin
   index := indexofunknowntexcommand;
   warningmessage('readini','could not read index from INI file')
 end;
 if not eof(ini) then
   readln(ini)
end;






[GLOBAL] PROCEDURE setuptree( var ini : text; var tree : argtree );
var
  list : arglist;
  index : integer;
begin
   openinifile( ini );
   tree := nulltree;
   while not eof(ini) do
   begin
      readarglistfromini( ini, index, list);

      {   ***** ttywritestring(' index read = ');
                ttywriteint(index);
                ttywriteln;                   *****      }

      insertlistintotree( list, tree )
   end;
   closeinifile( ini )
end;



END.