[Back to DOS SWAG index] [Back to Main SWAG index] [Original]
{
INI File Reading Unit--
THis UNIT will allow you to use *.INI files for config instead of a
full blown setup program, it will read ALMOST ALL INI files, except
for ones such as CGA.INI.
I'm sure no one will have trouble with it, it is pretty straight
forward (even a C/C++ programmer could understand it <g>)
NOTE FROM AUTHOR:
Well, I'm sure I bugged some people on the FIDOs about stupid errors
while making this, as it turns out, I have finished my until already
after just getting rid of the last known bug.
I am releasing this as public domain, if you find it usefull, I would
appreciate credit. And please, if you make changes, send me a copy.
USE: (An example is included at the end)
1) Change the constant MAXINI to the maxium amount of variables.
2) Declare a variable of INI_TYP.
3) Run INIVALS at the start of your program
4) Assign the ITEMSTR value to the keyword to look for
(ie.. if you wanted to associate ANYVAR[1].ITEMSTR := 'HERE',
then if this is found in the file "HERE=THERE", the return
result of ANYVAR[1].RESULT will be "THERE")
5) Run READINI on the INI file.
6) Use the values returned in RESULT for config.
FYI.. Case/Spaces/Tabs do not matter NO MATTER WHERE THEY ARE!
BTW.. I cut this code from a program of mine where I originally created it,
if it doesnt work tell me and I will add whatever I forgot. So far
it seems to have no obvious problems.
SWAG use is permitted.
ONE FINAL NOTE:
I blame all bugs/spelling errors/etc.. on my word processor.
You use this program at your own risk, I will do accept any liability
for ANY problems whatsoever.
No animals were harmed in the making of this program.
}
{$IFDEF DEBUG}
{$A+,B-,D+,F-,G-,I-,K-,L-,N-,E-,P-,Q+,R+,S+,T-,V-,W-,X+,Y-}
{$ELSE}
{$A+,B-,D-,F-,G-,I-,K-,L-,N-,E-,P-,Q-,R-,S-,T-,V-,W-,X+,Y-}
{$ENDIF}
UNIT INIT; { see test program below }
Interface
Type
Str12 = String[12];
Str26 = String[26];
Str35 = String[35];
Str75 = String[75];
Str127 = String[127];
Const
MaxIni = 5; {Change this to whatever}
CommentSet : Set Of Char = ['[','!','#','/','>'];
INI_FNotFound = $02; {Returned by READINI}
INI_FIOError = $01; {""}
INI_FOk = $00; {""}
Type
INI_REC = Record
KEY : Str35; {keyword}
Result : Str35; {Found after: ItemStr,'=',Result}
Found : Boolean; {Found yet?}
End;
INI_TYP = Array[1..MaxIni] of INI_REC;
Procedure InitVals(Var a999 : INI_TYP);
Function ReadIni(F:Str75;var InIv : Ini_Typ):Byte;
Function _S3(Base : String;Var S1,S2 : String):Byte;
Function EraseChar2(Ch:Char;St:String):String;
Function UpStr(const s:string):string;
Implementation
Procedure InitVals(Var A999 : INI_TYP);
Var W:Word;
Begin
For W := 1 to MaxIni do A999[W].Found := False;
End;
Function EraseChar2(Ch:Char;St:String):String;
Var NB:Byte;
Begin
For NB := 1 to length(St) do If St[Nb] = CH then Delete(St,Nb,1);
EraseChar2 := St;
End;
{Function EraseChar(Ch:Char;St:String):String;
Begin
While Copy(St, 1, 1) = CH do
Delete(St, 1, 1);
While Copy(St, Length(St), 1) = CH do
Delete(St, Length(St), 1);
EraseCHar := St;
End;}
Function _S3(Base : String;Var S1,S2 : String):Byte;
var B,B2:Byte;
Begin
_S3 := 0;
B := Pos('=',Base);
If B > 1 then
Begin
S1 := Copy(Base,1,B-1);
S2 := Copy(Base,B+1,Length(Base));
S1 := EraseChar2(' ',S1);
End Else _S3 := 1;
End;
Function ReadIni(F:Str75;var InIv : Ini_Typ):Byte;
Var INIFILE:Text;
TempStr : Str127;
S1,S2 : Str35;
W1 : Word;
Begin
Assign(INIFILE, F);
Reset(INIFILE);
READINI := 0;
IF IOresult <> 0 then
Begin
ReadInI := INI_FNotFound;
Exit;
End;
While not EOF(INIFILE) do
Begin
Readln(INIFILE, TempStr); {Load String}
If length(TempStr) > 3 then {Min: A=A}
Begin
TempStr := UpStr(TempStr); {Make it caps}
TempStr := EraseChar2(' ',TempStr); {Get rid of spaces}
TempStr := EraseChar2(#9,TempStr); {Get rid of tabs}
If not (TempStr[1] in CommentSet) then {Not a comment?}
If _S3(TempStr, S1, S2) = 0 then {Is it a valid param?}
For W1 := 1 to MaxIni do
Begin{Search all INI variables}
If not INIV[W1].Found then {has not been checked out}
If UpStr(INIV[W1].Key) = S1 then {Do they match?}
Begin
INIV[W1].Result := S2;
INIV[W1].Found := True;
W1 := MaxINI; {ENd search}
End;{Begin If ItemStr = S1}
End;{For W1 to}
End;{If Length > 3}
End;{While not EOF}
Close(INIFILE);
End;
Function UpStr(const s:string):string; assembler; {Upper Case String}
{This is the only code that is not mine...}
asm
push ds
lds si,s
les di,@result
lodsb { load and store length of string }
stosb
xor ch,ch
mov cl,al
jcxz @empty { FIX for null length string }
@upperLoop:
lodsb
cmp al,'a'
jb @cont
cmp al,'z'
ja @cont
sub al,' '
@cont:
stosb
loop @UpperLoop
@empty:
pop ds
end; { UpStr }
ENd.
{------------------ test program -----------------------}
{This will open the windows INI file WIN.INI and find data}
Program Test;
Uses INIT;
Const
INIFILEStr = 'C:\WINDOWS\WIN.INI';
Var
ANyA : INI_TYP;
Result : Byte;
Begin
INITVALS(ANYA);
ANYA[1].Key := 'sCountry';
Result := ReadINI(INIFILEstr,ANYA);
If Result <> INI_FOK then
Begin
Writeln('');
Writeln('It seems that you are missing the file ',INIFILEStr);
Writeln('so I cannot detect your country.');
Writeln('');
readln;
Halt(1);
End;
Writeln('');
Writeln('It seems that you live in the ',ANYA[1].RESULT,'.');
Writeln('What a great place!');
Writeln('');
Readln;
ENd.
[Back to DOS SWAG index] [Back to Main SWAG index] [Original]