[Back to TEXTFILE SWAG index] [Back to Main SWAG index] [Original]
{
Could somebody post some source code on how to read in a config File? and
also have it ignore lines that start With the semicolon. Sorta like this
one:
Sure do, here is mine. I have to include quite a couple of other Functions as
they are used in the readcfg. I included one 'block' as an example in which
you read in a particular keyWord (named: 'keyWord') and find the parammeter
which follows. You can duplicate this block as many times as you like.
Although it scans the whole File again, it's pretty fast as it does it in
memory.
}
Function Trim(S : String) : String;
{Return a String With leading and trailing white space removed}
Var
I : Word;
SLen : Byte Absolute S;
begin
While (SLen > 0) and (S[SLen] <= ' ') do
Dec(SLen);
I := 1;
While (I <= SLen) and (S[I] <= ' ') do
Inc(I);
Dec(I);
if I > 0 then
Delete(S, 1, I);
Trim := S;
end;
{******************************************************}
Function StrUpper(Str: String): String; Assembler;
Asm
jmp @Start { Jump over Table declared in the Code Segment }
@Table:
{ Characters from ASCII 0 --> ASCII 96 stay the same }
DB 00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21
DB 22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43
DB 44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65
DB 66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87
DB 88,89,90,91,92,93,94,95,96
{ Characters from ASCII 97 "a" --> ASCII 122 "z" get translated }
{ to Characters ASCII 65 "A" --> ASCII 90 "Z" }
DB 65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86
DB 87,88,89,90
{ Characters from ASCII 123 --> ASCII 127 stay the same }
DB 123,124,125,126,127
{ Characters from ASCII 128 --> ASCII 165 some changes
#129 --> #154, #130 --> #144, #132 --> #142, #134 --> #143
#135 --> #128, #145 --> #146, #148 --> #153, #164 --> #165}
DB 128,154,144,131,142,133,143,128,136,137,138,139,140,141,142,143
DB 144,146,146,147,153,149,150,151,152,153,154,155,156,157,158,159
DB 160,161,162,163,165,165
{ Characters from ASCII 166 --> ASCII 255 stay the same }
DB 166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181
DB 182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197
DB 198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213
DB 214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229
DB 230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245
DB 246,247,248,249,250,251,252,253,254,255
@Start:
push DS { Save Turbo's Data Segment address }
lds SI,Str { DS:SI points to Str[0] }
les DI,@Result { ES:DI points to StrUpper[0] }
cld { Set direction to Forward }
xor CX,CX { CX = 0 }
mov BX,ofFSET @Table { BX = offset address of LookUpTable }
lodsb { AL = Length(Str); SI -> Str[1] }
mov CL,AL { CL = Length(Str) }
stosb { Move Length(Str) to Length(StrUpper) }
jcxz @Exit { Get out if Length(Str) is zero }
@GetNext:
lodsb { Load next Character into AL }
segcs XLAT { Translate Char using the LookupTable }
{ located in Code Segment at offset BX }
stosb { Save next translated Char in StrUpper}
loop @GetNext { Get next Character }
@Exit:
pop DS { Restore Turbo's Data Segment address }
end {StrUpper};
{-----------------------------------------------------------------}
Function MCS(element,line:String):Integer;
{Returns the position of an element in a line.
Returns zero if no match found.
Example: line:='abcdefg'
i:=MCS('bc',line) would make i=2
MCS is not Case sensitive}
begin
MCS:=pos(StrUpper(element),StrUpper(line));
end;
Function getparameter(element,line:String;pos:Integer):String;
{This Function is called With 'pos' already indexed after the command Word in
a line. It searches For the Word(s) after the command Word in the rest of
the line, up to the end of the line or Until a ; is encountered}
Var
n,b,e,l:Byte;
begin
n:=pos+length(element);
{places n-index just after keyWord}
While (line[n]=' ') do
inc(n); {increment line[n] over spaces}
b:=n; l:=length(line);
While (n<=l) do
begin
if line[n]<>';' then
begin
inc(n);
e:=n;
end
else
begin
e:=n;
n:=l+1;
end;
end;
getparameter:=trim(copy(line,b,e-b));
end;
Procedure ReadCfg(name:String); {'name' is Filename to read in}
Type
Line = String[80];
Lines = Array[0..799] of Line;
LinesP = ^Lines;
Var
TextBuf : LinesP;
TextFile : Text;
Index,Number:Integer;
buffer:Array[1..2048] of Char;
s:line;
s1:line;
n:Byte;
i:Integer;
begin
assign( TextFile, name );
reset( TextFile );
SetTextBuf(TextFile,Buffer);
Index := 0;
new(TextBuf);
While not eof( TextFile) do
{Read the Text File into heap memory}
begin
readln( TextFile,s);
if s[1]<>';' then if s<>'' then
begin
TextBuf^[Index]:=s;
inc( Index )
end;
end;
close( TextFile );
{********begin of "find a keyWord" block***********}
Number := Index -1;
For Index := 0 to Number do
begin
s:=( TextBuf^[ Index ]);
n:=MCS('BoardNo',s);
if n > 0 then
begin
s1:=getparameter('KeyWord',s,n);
{do other things With found 'keyWord'}
end;
end;
{end of "find a keyWord" block}
dispose( TextBuf); {release heap memory}
end;
[Back to TEXTFILE SWAG index] [Back to Main SWAG index] [Original]