[Back to DIRS SWAG index]  [Back to Main SWAG index]  [Original]

{
JH>Is anybody familiar with a way to do Wildcards?
JH>I want to be able to select
JH>something ie: *.ZIP and it makes a que list from all of them?

If you ever need a procedure to check whether a file conforms to a wildcard
Ive got just the right procedure for you.

_______________0/__________________________________________
               0\                                           }

Function DirOnly(FileName:PathStr) : DirStr;
        Var
                Dir  : DirStr;
                Name : NameStr;
                Ext  : ExtStr;
        Begin
                FSplit(FileName,Dir,Name,Ext);
                DirOnly := Dir;
        End;

Function NameOnly(FileName:PathStr) : TStr12;
        Var
                Dir  : DirStr;
                Name : NameStr;
                Ext  : ExtStr;
        Begin
                FSplit(FileName,Dir,Name,Ext);
                NameOnly := Name+Ext;
        End;

Function BaseNameOnly(FileName:PathStr) : NameStr;
        Var
                Dir  : DirStr;
                Name : NameStr;
                Ext  : ExtStr;
        Begin
                FSplit(FileName,Dir,Name,Ext);
                BaseNameOnly := Name;
        End;

Function ExtOnly(FileName:PathStr) : ExtStr;
        Var
                Dir  : DirStr;
                Name : NameStr;
                Ext  : ExtStr;
        Begin
                FSplit(FileName, Dir, Name, Ext);
                If Pos('.',Ext) <> 0 Then Delete(Ext,1,1);
                ExtOnly := Ext;
        End;

Function SameName(N1,N2:NameStr) : Boolean;
        Var
                P1,P2 : Byte;
                Match : Boolean;
        Begin
                P1    := 1;
                P2    := 1;
                Match := True;

                If (Length(N1) = 0) And (Length(N2) = 0) Then
                        Match := True
                Else
                        If Length(N1) = 0 Then
                                If N2[1] = '*' Then
                                        Match := True
                                Else
                                        Match := False
                        Else
                                If Length(N2) = 0 Then
                                        If N1[1] = '*' Then
                                                Match := True
                                        Else
                                                Match := False;

                While (Match = True) And (P1 <= Length(N1)) And (P2 <= 
Length(N2)) Do
                        If (N1[P1] = '?') Or (N2[P2] = '?') Then
                                Begin
                                        Inc(P1);
                                        Inc(P2);
                                End
                        Else
                                If N1[P1] = '*' Then
                                        Begin
                                                Inc(P1);
                                                If P1 <= Length(N1) Then
                                                Begin
                                                While (P2 <= Length(N2)) And
                                                Not SameName(Copy(N1,P1,Length(N1)-P1+1),Copy(N2,P2,Length(N2)-P2+1)) Do
                                                Inc(P2);
                                                If P2 > Length(N2) Then Match := False
                                                Else

Begin

        P1 := Succ(Length(N1));

        P2 := Succ(Length(N2));

End;
                   End
                     Else
                     P2 := Succ(Length(N2));
                     End
                      Else
                      If N2[P2] = '*' Then
                              Begin
                                      Inc(P2);
                                      If P2 <= Length(N2) Then
                                              Begin

While (P1 <= Length(N1)) And

           Not SameName(Copy(N1,P1,Length(N1)-P1+1),Copy(N2,P2,Length(N2)-P2+1)) Do

        Inc(P1);
        If P1 > Length(N1) Then

        Match := False

Else

        Begin

                P1 := Succ(Length(N1));

                P2 := Succ(Length(N2));

        End;
                          End
                          Else
                          P1 := Succ(Length(N1));
                    End
            Else
            If UpCase(N1[P1]) = UpCase(N2[P2]) Then
                            Begin
                                    Inc(P1);
                                    Inc(P2);
                            End
                    Else
                            Match := False;

                If P1 > Length(N1) Then
                        Begin
                                While (P2 <= Length(N2)) And (N2[P2] = '*') 
Do
                                        Inc(P2);
                                If P2 <= Length(N2) Then
                                        Match := FALSE;
                        End;

                If P2 > Length(N2) Then
                        Begin
                                While (P1 <= Length(N1)) And (N1[P1] = '*')
Do
                                        Inc(P1);
                                If P1 <= Length(N1) Then
                                        Match := False;
                        End;

                SameName := Match;
        End;

Function SameFile(File1,File2:PathStr) : Boolean;
        Var
                Dir1,Dir2 : DirStr;
        Begin
                File1 := FExpand(File1);
                File2 := FExpand(File2);
                Dir1  := DirOnly(File1);
                Dir2  := DirOnly(File2);

                SameFile :=  SameName(BaseNameOnly(File1),BaseNameOnly(File2)) And
                SameName(ExtOnly(File1),ExtOnly(File2)) And
                                        (Dir1 = Dir2);
        End;

_______________0/__________________________________________
               0\ 

Sorry about the bad formatting but I use LONG lines with tabs for all my 
indents with my tab size set to 4. This procedure handles all cases of 
wildcards including some that dos doeen't:

    SameFile('*.PAS','HELLO.PAS) = TRUE
    SameFile('*.P?L','HELLO.PAL) = TRUE    
    SameFile('TE*.PAS','TOTO.PAS') = False
    SameFile('*PA.EXE','SUPA.EXE') = True (Not handled by dos!)
    SameFile('ST?P.*','STOP.COM') = True


[Back to DIRS SWAG index]  [Back to Main SWAG index]  [Original]