[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]