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