home *** CD-ROM | disk | FTP | other *** search
- {
- 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;