[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);