pascalabcnet/TestSuite/CompilationSamples/IniFile.pas

186 lines
4.3 KiB
ObjectPascal
Raw Normal View History

2015-06-27 19:33:50 +03:00
// Copyright (c) Ivan Bondarev, Stanislav Mihalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
2015-05-14 22:35:07 +03:00
unit IniFile;
interface
uses System.Collections;
type
TIniFile = class
fname: string;
sl: SortedList;
function IndexOfSection(Section: string): integer;
function IndexOfIdent(SectionNum: integer; Ident: string): integer;
public
constructor Create(name: string);
procedure Save;
property FileName: string read fname;
procedure WriteString(Section,Ident: string; Value: string);
function ReadString(Section,Ident: string; DefaultValue: string): string;
procedure WriteInteger(Section,Ident: string; Value: integer);
procedure WriteBoolean(Section,Ident: string; Value: boolean);
function ReadInteger(Section,Ident: string; DefaultValue: integer): integer;
function ReadBoolean(Section,Ident: string; DefaultValue: boolean): boolean;
end;
implementation
constructor TIniFile.Create(name: string);
var
f: text;
s,Section,Ident,Value: string;
p: integer;
sl1: SortedList;
begin
sl := new SortedList;
fname := name;
assign(f,fname);
if not FileExists(fname) then
begin
rewrite(f);
closefile(f);
end
else
begin
try
Section := '';
reset(f);
while not eof(f) do
begin
readln(f,s);
s := Trim(s);
if Length(s)=0 then
continue;
if s[1]='[' then // Section
begin
section := Copy(s,2,Length(s)-2);
// <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if IndexOfSection(Section)<0 then
sl.Add(Section,new SortedList);
end
else
begin
if Section = '' then
continue;
p := Pos('=',s);
if p=0 then
continue;
Ident := Copy(s,1,p-1);
Delete(s,1,p);
Value := s;
sl1 := SortedList(sl[Section]);
sl1[Ident] := Value;
end;
end;
except
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
end;
close(f);
end;
end;
function TIniFile.IndexOfSection(Section: string): integer;
begin
Result := sl.IndexOfKey(Section);
end;
function TIniFile.IndexOfIdent(SectionNum: integer; Ident: string): integer;
var sl1: SortedList;
begin
sl1 := SortedList(sl.GetByIndex(SectionNum));
Result := sl1.IndexOfKey(Ident);
end;
procedure TIniFile.Save;
var
i,j: integer;
sl1: SortedList;
f: text;
begin
assign(f,fname);
rewrite(f);
for i:=0 to sl.Count-1 do
begin
writeln(f,'['+sl.GetKey(i)+']');
sl1 := SortedList(sl.GetByIndex(i));
for j:=0 to sl1.Count-1 do
writeln(f,sl1.GetKey(j)+'='+string(sl1.GetByIndex(j)));
writeln(f);
end;
close(f);
end;
procedure TIniFile.WriteString(Section,Ident: string; Value: string);
var
i: integer;
sl1: SortedList;
begin
i := IndexOfSection(Section);
if i<0 then
begin
// Create Section
sl1 := new SortedList;
sl1[Ident] := Value;
sl[Section] := sl1;
end
else
begin
sl1 := SortedList(sl.GetByIndex(i));
sl1[Ident] := Value
end;
end;
function TIniFile.ReadString(Section,Ident: string; DefaultValue: string): string;
var
i,j: integer;
sl1: SortedList;
begin
i := IndexOfSection(Section);
if i<0 then
Result := DefaultValue
else
begin
sl1 := SortedList(sl.GetByIndex(i));
j := IndexOfIdent(i,Ident);
if j<0 then
Result := DefaultValue
else Result := string(sl1.GetByIndex(j));
end;
end;
procedure TIniFile.WriteInteger(Section,Ident: string; Value: integer);
begin
WriteString(Section,Ident,IntToStr(Value));
end;
procedure TIniFile.WriteBoolean(Section,Ident: string; Value: boolean);
begin
if Value then
WriteString(Section,Ident,'True')
else WriteString(Section,Ident,'False')
end;
function TIniFile.ReadInteger(Section,Ident: string; DefaultValue: integer): integer;
var
s: string;
i,err: integer;
begin
s := ReadString(Section,Ident,IntToStr(DefaultValue));
Val(s,i,err);
if err=0 then
Result := i
else Result := 0;
end;
function TIniFile.ReadBoolean(Section,Ident: string; DefaultValue: boolean): boolean;
var s: string;
begin
if DefaultValue then
s := ReadString(Section,Ident,'True')
else s := ReadString(Section,Ident,'False');
Result := UpperCase(s) = 'TRUE'
end;
end.