{ษอออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออป
 บ                                 MAKEINI 1.6                               บ
 ฬอออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออน
 บ Software made with BASE v4.2                                              บ
 บ Coded by Zuul as BouFFtou as Cheveau Frdric.                            บ
 บ And by Sybaris as Planas Jean-Pierre.                                     บ
 บ Contact us on Internet : Zuulcoder@hotmail.com ou Sybaris@multimania.com  บ
 บ If you want more informations look at : http://www.multimania.com/mos     บ
 ศอออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออผ}

{$M 25000,0,65520}                      {*Stack And Heap*}

Program MakeINI;                        {*Program Name*}

Uses Dos,                               {*BP7 Units*}
     MOS_STR, MOS_CRT, MOS_XMS,
     MOS_DSK, MOS_FIL, MOS_VAR;                  {*MOS Units*}

Const Program_name ='MAKEINI';
      Ver_Num      ='v1.6';
      Last_update  ='29.09.1998';
      Copyright    ='(C)1998-99 JP.Planas';
      Authors  ='Written by JP.PLANAS '+Last_Update+'. Tel: 04.68.61.19.77';

Var DoneOne       :Boolean;             {*If at least a file is done     *}
    Backup        :Boolean;             {*Create a backup for each file  *}
    NoMess        :Boolean;             {*No messages                    *}
    Sub           :Boolean;             {*Recursive parameter            *}
    SAlias,TAlias :Boolean;             {*Boolean Mask (Source & Target) *}
    SPath,SMask   :String;              {*Source Path & Mask*}
    TPath,TMask   :String;              {*Target Path & Mask*}
    WorkD,Bmp     :String;
    FullPath      :Byte;
    Locale        :Integer;

{ษอออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออป
 บ                          FUNCTION OneINI                                  บ
 ฬอออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออน
 บ IN.....: FN (STRING) = FileName of the ini file to work on                บ
 บ          WD (STRING) = New work directory                                 บ
 บ          Graphi (STRING) = Graphic path or graphic name                   บ
 บ          Gfx (BYTE) = 0 Don't change graphic file.                        บ
 บ                       1 Change Graphic Path and Name                      บ
 บ                       2 Change Graphic Path                               บ
 บ          Loc (BYTE) = 0 : Don't change locale file                        บ
 บ                       1..3 : Set loacale file                             บ
 บ OUT....: (BYTE) = 0 if no error                                           บ
 บ                   1 if not a MOS'INI file                                 บ
 บ                   2 I/O error.                                            บ
 บ EXPLAIN: Change Working directory and graphic in a MOS'INI file.          บ
 ศอออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออผ}
Function OneINI(FN:String;Wd:String;Graphi:String;Gfx:Byte;Loc:Byte):Byte;
Var F,T:Text;
    ST,S:String;
    FirstLine:Boolean;
    S2:String;

Begin
Assign(F,FN);
{$i-}
Reset(F);
{$i+}
If IoResult<>0 Then Begin OneIni:=2;Exit;End;
ST:='C:\XXX.TMP';
Assign(T,ST);
{$i-}
Rewrite(T);
{$i+}
If IoResult<>0 Then Begin OneIni:=2;Close(F);Exit;End;
FirstLine:=True;

While Not Eof(F) do
  Begin
  Readln(F,S);
  If (FirstLine) And (Pos('Startup-Sequence',S)=0) Then
    Begin
    OneIni:=1;
    Close(F);Close(T);
    Exit;
    End;
  FirstLine:=False;
  If (Pos('Working directory',S)>0) And (Wd<>'') Then S:='Working directory = '+Wd;

  If (Pos('Locale language',S)>0) And (Loc<>0) Then
    Begin
    Str(loc,S2);
    S:='Locale language = '+S2;
    End;

  If (Pos('Graphic Screen',S)>0) And (Gfx<>0) Then
    Begin
    If Gfx=1 Then S:='Graphic Screen = '+Graphi Else
      Begin
      S:=Copy(S,Pos('=',S)+1,Length(S));
      S:=Str_CleanSpaces(S);
      If Str_PosLast('\',S)=0 Then S:='Graphic Screen = '+Graphi+S Else
        S:='Graphic Screen = '+Graphi+Copy(S,Str_PosLast('\',S)+1,Length(S));
      End;
    End;
  Writeln(T,S);
  End;
Close(T);
Close(F);

If Not File_Replace(FN,ST) Then Begin OneIni:=2;Exit;End;
OneINI:=0;
End;


{ษอออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออป
 บ                                  Authors                                  บ
 ฬอออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออน
 บ OUT....: Display more informations about authors.                         บ
 ศอออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออผ}

Procedure Sybaris_Info;
Begin
 Writeln(Program_name,' ',Ver_num,' - Coded by J.P. PLANAS as SYBARIS.');
 Writeln;
 Writeln('PLANAS Jean-Pierre Alias SYBARIS ');
 Writeln('41 Route de perpignan ');
 Writeln('66240 Saint-Estve ');
 Writeln('FRANCE');
 Writeln('E-Mail : Sybaris@Multimania.com');
 Writeln('Minitel : 36.15 RTEL1. BAL : SYBARIS');
 Writeln('Member of Club Informatique Stphanois (CIS)');
 Writeln('CIS Cami dels horts 66240 Saint-Estve');
 Writeln;
 Halt(0);
End;

Procedure Zuul_Info;
Begin
 Writeln(Program_name,' ',Ver_num,' - Code by F.CHEVEAU as ZuuL.');
 Writeln;
 Writeln('CHEVEAU Frdric Alias ZuulCoder ');
 Writeln('8 Passage des grillons');
 Writeln('66000 Perpignan');
 Writeln('FRANCE');
 Writeln('E-Mail : Zuulcoder@Hotmail.com');
 Writeln('Minitel : 36.15 RTEL1. BAL : BouFFtou');
 Writeln('Member of Club Informatique Stphanois (CIS)');
 Writeln('CIS Cami dels horts 66240 Saint-Estve');
 Writeln;
 Halt(0);
End;

{ษอออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออป
 บ                                    HELP                                   บ
 ฬอออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออน
 บ OUT....: Display the application help                                     บ
 ศอออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออผ}

Procedure Help;
Begin
 Writeln(Program_Name,' ',Ver_Num,' - Base Files Tool.');
 Writeln(Authors);
 Writeln('Explain Text.');
 Writeln;
 Writeln('Synopsis: ',Program_Name,' <File> /Commands /Switches');
 Writeln('Inputfile <File>        : File(s) to be processed');
 Writeln;
 Writeln('Commands: /?            : This help');
 Writeln('          /Author       : More information about the author');
 Writeln('Switches: /Nm           : No display messages');
 Writeln('          /S            : Recurse subdirectories');
 Writeln('          /B            : Create backup file');
 Writeln('          /WD= Path     : Path of the wordking directory of MOS');
 Writeln('          /BMPPATH= Path: Path where to find the BMP file');
 Writeln('          /BMPFILE= File: Path and file name of a BMP file');
 Writeln('          /LOC = 1,2,3  : Locale language to put in ini file');
 Writeln('Example : ',Program_Name,' *.INI /s');
 Writeln;
 Writeln('Note    : Please note that aliases and jockers are supported.');
 Writeln('          Commands and switches are not case sensitives.');
 Writeln('          Redirection to a file possible with > and >>.');
 Writeln('          Don''t support long filenames (Windows and NT OS).');
 Halt(0);
End;

{ษอออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออป
 บ                 PROCEDURE CALLED FOR EACH FILES                           บ
 ศอออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออผ}

Procedure FILE_ACTION(S:PathStr);Far;
Var FD  :DirStr;                       {*FSplit...*}
    FN  :NameStr;
    FE  :ExtStr;
    T   :String;                       {*Target*}
    AffName1,AffName2:String;
    R   :Byte;

Begin
DoneOne:=True;
FSplit(S,FD,FN,FE);                    {*Split Filename*}

AffName1:=FN+FE;
AffName2:=Str_FileMask(FN+FE,TMask);
T:=Tpath+Str_Extr(SPath,S)+AffName2;

If Backup Then File_Copy(S,FD+FN+'.BAK');    {*Backup of the file*}
R:=OneIni(S,WorkD,Bmp,FullPath,Locale);
If Not Nomess Then
  Begin
  If R=0 Then Writeln(AffName1:12,' Done');
  If R=1 Then Writeln(AffName1:12,' Not a MOS INI file');
  If R=2 Then Writeln(AffName1:12,' I/O error');
  End;
End;

{ษอออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออป
 บ                       MAIN PROGRAM (INITIALISATIONS)                      บ
 ศอออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออผ}
Var Source        :String;              {*Source File(s)*}
    Target        :String;              {*Taget Files(s)*}
    A,I           :Integer;             {*Loop*}
    Par           :String;              {*Paramtres*}
    e             :Integer;             {*Val error*}

Begin
DoneOne:=False;                         {*Initialisations...*}
TextColor(7);

{************************ STANDARD PARAMETERS *******************************}

Par:='/NM';                             {*Test if no messages*}
If Parameter(Par)>0 Then NoMess:=True Else NoMess:=False;

If Not NoMess Then Clrscr;              {*Clear Screen*}

Par:='/Author';
If (Parameter(Par)>0) Then Sybaris_info;   {*Sybaris or Zuul Infos*}

Par:='/?';
If (Parameter(Par)>0) Then Help;        {*Display help*}

If Not NoMess Then                      {*Display application title*}
  Begin
  Writeln(Program_Name,' ',Ver_Num,' - ',Copyright);
  Writeln;
  End;

Par:='/S';                              {*Resurce parameter...*}
If Parameter(Par)>0 Then Sub:=Yes Else Sub:=No;

Par:='/B';                              {*Create Backup per File...*}
If Parameter(Par)>0 Then Backup:=Yes Else Backup:=No;

WorkD:='';
Par:='/WD';
If (Parameter(Par)>0) And (Par<>'/WD') Then WorkD:=FExpand(Par);

Locale:=0;
Par:='/LOC';
If (Parameter(Par)>0) And (Par<>'/LOC') Then
  Begin
  Val(Par,Locale,e);
  If e<>0 Then Locale:=0;
  End;

FullPath:=0;
Par:='/BMPFILE';
If (Parameter(Par)>0) And (Par<>'/BMPFILE') Then
  Begin
  Bmp:=Par;
  FullPath:=1;
  End;

Par:='/BMPPATH';
If (Parameter(Par)>0) Then if (Par<>'/BMPPATH') And (FullPath<>1) Then
  Begin
  Bmp:=FExpand(Par);
  If Bmp[Length(Bmp)]<>'\' Then Bmp:=Bmp+'\';
  FullPath:=2;
  End
Else If (FullPath=1) Then
  Begin
  Writeln('/BMPPATH and /BMPFILE parameter founds in the same time');
  Exit;
  End;

If (FullPath=0) And (WorkD='') And (Locale=0) Then
  Begin                                 {*At least only source parameter*}
  If Not NoMess Then Writeln('Not enougth parameters...');
  Exit;
  End;

{*************************** COUNT PARAMETERS *******************************}

A:=1;
If NoMess Then Inc(A);
If Sub    Then Inc(A);
If Backup Then Inc(A);
If FullPath<>0 Then Inc(A);
If WorkD<>'' Then Inc(A);
If Locale<>0 Then Inc(A);

If Paramcount<A Then
  Begin                                 {*At least only source parameter*}
  If Not NoMess Then Writeln('Not enougth parameters...');
  Exit;
  End;

{****************************************************************************}
{ If you want to make a program like "BASE Source Target" use                }
{ "If Paramcount>A+1 Then" Else                                              }
{ If you want to make a program like "BASE Source" use                       }
{ "If Paramcount>A Then"                                                     }
{****************************************************************************}

If Paramcount>A Then
  Begin                                 {*Source + target parameters*}
  If Not NoMess Then Writeln('Too much parameters...');
  Exit;
  End;

{************************* LOOK FOR SOURCE / TARGET *************************}
                                        {*Looking for source parameter*}
I:=1;While (Pos('/',ParamStr(I))>0) And (I<=ParamCount) Do Inc(I);
If I>ParamCount Then
  Begin
  If Not NoMess Then Writeln('Source parameter not found...');
  Exit;
  End;
Source:=Dsk_FExpand(ParamStr(I));       {*Get Source Parameter*}

If A=Paramcount Then Target:='*.*'      {*No Parameter Target*}
Else
  Begin
  A:=I;                                 {*Looking for target parameter*}
  I:=ParamCount;
  While (Pos('/',ParamStr(I))>0) And (I>0) Do Dec(I);
  If (I=0) Or (I=A) Then
    Begin
    If Not NoMess Then Writeln('Target parameter not found...');
    Exit;
    End;
  Target:=Dsk_FExpand(ParamStr(I));     {*Get Parameter Target*}
  End;

{*************************** MANAGEMENT OF ALIAS ****************************}

SAlias:=False;                          {*If Jokers founds *}
TAlias:=False;
If (Pos('*',Source)>0) Or (Pos('?',Source)>0) Then SAlias:=True;
If (Pos('*',Target)>0) Or (Pos('?',Target)>0) Then TAlias:=True;

File_Split(Source,SPath,SMask);
File_Split(Target,TPath,TMask);

{************************** CALL FIND_FILES *********************************}

File_Find(SPath+SMask,Sub,FILE_ACTION);{*Search all files*}

{*************************** END OF PROGRAM *********************************}
If (Not DoneOne) And (Not NoMess)       {*No files found*}
  Then Writeln('File(s) "',SMask,'" not found...');

TextColor(7);                           {*The End...*}
If NoMess Then Gotoxy(1,WhereY-1);
End.
Begin
OneIni('B2.INI','TOTO','D:\',True);


End.
