Code: Select all
#WildCardsStringMatchEscapeCharacter = '/'
Declare.l EvalWildCardsStringMatch(string.s,wildcards.s,flags.l)
Declare.l WildCardsStringMatch(string.s,wildcards.s,flag.l)
Procedure.l EvalWildCardsStringMatch(string.s,wildcards.s,flags.l)
*char.CHARACTER=@wildcards
lastChar.c=0
Part$=""
Result$=""
Negate=#False
While *char\c<>0
Select *char\c
Case '|'
Select lastChar
Case #WildCardsStringMatchEscapeCharacter
Part$+Chr(*char\c)
Default
Result$+Str(WildCardsStringMatch(string,Part$,flags) ! Negate)+"|"
Part$=""
Negate=#False
EndSelect
lastChar=0
Case '&'
Select lastChar
Case #WildCardsStringMatchEscapeCharacter
Part$+Chr(*char\c)
Default
Result$+Str(WildCardsStringMatch(string,Part$,flags) ! Negate)+"&"
Part$=""
Negate=#False
EndSelect
lastChar=0
Case '~'
Select lastChar
Case #WildCardsStringMatchEscapeCharacter
Part$+Chr(*char\c)
Default
If Part$="" And Negate=#False
Negate=#True
Else
Part$+Chr(*char\c)
EndIf
EndSelect
lastChar=0
Case #WildCardsStringMatchEscapeCharacter
Select lastChar
Case #WildCardsStringMatchEscapeCharacter
Part$+Chr(*char\c)
lastChar=0
Default
lastChar=#WildCardsStringMatchEscapeCharacter
EndSelect
Default
If lastChar=0
Part$+Chr(*char\c)
Else
Part$+Chr(lastChar)+Chr(*char\c)
lastChar=0
EndIf
EndSelect
*char+1+#PB_Compiler_Unicode
Wend
Result$+Str(WildCardsStringMatch(string,Part$,flags) ! Negate)
If Len(Result$)>1
DataSection
!@@wcsm_eval_ORs:
Data.l 0
!@@wcsm_eval_ANDs:
Data.l 0
EndDataSection
!MOV esi, dword [p.v_Result$]
CompilerIf #PB_Compiler_Unicode
!MOVZX ebx, word [esi]
CompilerElse
!MOVZX ebx, byte [esi]
CompilerEndIf
!CMP ebx, 0
!JZ @@wcsm_eval_wend
!@@wcsm_eval_while:
!CMP ebx, '|'
!JNE @@wcsm_eval_case2
!@@wcsm_eval_case1:;case '|'
!MOV ecx, dword [@@wcsm_eval_ORs]
!JECXZ @@wcsm_eval_subwend1
!@@wcsm_eval_subwhile1:
!POP eax
!POP edx
!OR eax, edx
!PUSH eax
!DEC ecx
!JNZ @@wcsm_eval_subwhile1
!@@wcsm_eval_subwend1:
!INC ecx
!MOV dword [@@wcsm_eval_ORs], ecx
!JMP @@wcsm_eval_endselect
!@@wcsm_eval_case2:;case '&'
!CMP ebx, '&'
!JNE @@wcsm_eval_default
!INC dword [@@wcsm_eval_ANDs]
!JMP @@wcsm_eval_endselect
!@@wcsm_eval_default:;default
!SUB ebx, 30h
!PUSH ebx
!MOV ecx, dword [@@wcsm_eval_ANDs]
!JECXZ @@wcsm_eval_subwend2
!@@wcsm_eval_subwhile2:
!POP eax
!POP edx
!AND eax, edx
!PUSH eax
!DEC ecx
!JNZ @@wcsm_eval_subwhile2
!@@wcsm_eval_subwend2:
!MOV dword [@@wcsm_eval_ANDs], ecx
!@@wcsm_eval_endselect:
CompilerIf #PB_Compiler_Unicode
!INC esi
!INC esi
!MOVZX ebx, word [esi]
CompilerElse
!INC esi
!MOVZX ebx, byte [esi]
CompilerEndIf
!CMP ebx, 0
!JNZ @@wcsm_eval_while
!@@wcsm_eval_wend:
!MOV ecx, dword [@@wcsm_eval_ORs]
!JECXZ @@wcsm_eval_subwend3
!@@wcsm_eval_subwhile3:
!POP eax
!POP edx
!OR eax, edx
!PUSH eax
!DEC ecx
!JNZ @@wcsm_eval_subwhile3
!@@wcsm_eval_subwend3:
!MOV dword [@@wcsm_eval_ORs], ecx
!POP eax
ProcedureReturn
Else
ProcedureReturn Val(Result$)
EndIf
EndProcedure
Procedure.l WildCardsStringMatch(string.s,wildcards.s,flag.l)
If flag=0
string=LCase(string)
wildcards=LCase(wildcards)
EndIf
If wildcards=""
ProcedureReturn #True
EndIf
If Left(wildcards,1)<>"*" And Left(wildcards,1)<>"?" And Left(wildcards,1)<>"#" And Right(wildcards,1)<>"*" And Right(wildcards,1)<>"?" And Right(wildcards,1)<>"#" : wildcards="*"+wildcards+"*" : EndIf
*Wide1.CHARACTER
*Wide2.CHARACTER
*pos.CHARACTER=@string
*char.CHARACTER=@wildcards
*sPos.CHARACTER
CompilerIf #PB_Compiler_Unicode
Macro UnicodeNumberWildCardCompare(var)
((var>='0' And var<='9') Or (var>=$FF10 And var<=$FF19) Or (var>=$00BC And var<=$00BE) Or (var>=2153 And var<=$2182) Or (var>=$2070 And var<=$2079) Or (var>=$2080 And var<=$2089) Or (var>=$2460 And var<=$249B) Or (var>=$2776 And var<=$2793) Or (var>=$3220 And var<=$3229) Or (var>=$3280 And var<=$3289))
EndMacro
CompilerElse
Macro UnicodeNumberWildCardCompare(var)
((var>='0' And var<='9') Or var=$B9 Or var=$B2 Or var=$B3 Or (var>=$BC And var<=$BE))
EndMacro
CompilerEndIf
Repeat
Select *char\c
Case '*'
*Wide1=*pos
*Wide2=*char+1+#PB_Compiler_Unicode
If *Wide2\c=0 Or (*Wide1\c=0 And RemoveString(wildcards,"*")="")
ProcedureReturn #True
EndIf
If *Wide1\c=0
ProcedureReturn #False
EndIf
*sPos=*char+1+#PB_Compiler_Unicode
While *sPos\c='*'
*char=*sPos
*sPos+1+#PB_Compiler_Unicode
Wend
If *sPos\c=*pos\c Or *sPos\c='?' Or (*sPos\c='#' And UnicodeNumberWildCardCompare(*pos\c))
*Wide2=*sPos
While *Wide2\c<>'*' And *Wide2\c<>0
If *Wide1\c=*Wide2\c Or *Wide2\c='?' Or (*Wide2\c='#' And UnicodeNumberWildCardCompare(*Wide1\c))
*Wide1+1+#PB_Compiler_Unicode
*Wide2+1+#PB_Compiler_Unicode
Else
If *sPos\c=*Wide1\c
*Wide2=*char+1+#PB_Compiler_Unicode
Else
*Wide1+1+#PB_Compiler_Unicode
*Wide2=*sPos
EndIf
EndIf
If *Wide1\c=0
While *Wide2\c='*'
*Wide2+1+#PB_Compiler_Unicode
Wend
If *Wide2\c=0
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndIf
Wend
If *Wide2\c='*'
*pos=*Wide1
*sPos=*Wide2
Else
If *Wide1\c=*Wide2\c And *Wide2\c=0
ProcedureReturn #True
Else
If *Wide2\c=0 And *sPos\c<>'*'
If *Wide1\c=0
ProcedureReturn #False
Else
*pos+1+#PB_Compiler_Unicode
*sPos=*char
EndIf
Else
*pos=*Wide1
EndIf
EndIf
EndIf
*char=*sPos
Else
*pos+1+#PB_Compiler_Unicode
EndIf
Case '?'
If *pos\c<>0
*pos+1+#PB_Compiler_Unicode
*char+1+#PB_Compiler_Unicode
If *pos\c<>0 And *char\c=0
ProcedureReturn #False
EndIf
Else
ProcedureReturn #False
EndIf
Case '#'
If UnicodeNumberWildCardCompare(*pos\c)
*pos+1+#PB_Compiler_Unicode
*char+1+#PB_Compiler_Unicode
If *pos\c<>0 And *char\c=0
ProcedureReturn #False
EndIf
Else
ProcedureReturn #False
EndIf
Default
If *pos\c=*char\c
*pos+1+#PB_Compiler_Unicode
*char+1+#PB_Compiler_Unicode
Else
ProcedureReturn #False
EndIf
EndSelect
Until *char\c=0
ProcedureReturn #True
EndProcedure
Debug "Should be FALSE"
Debug "return = "+Str(EvalWildCardsStringMatch("abc_def-ghi.,;jkl","*??D*",1))
Debug "- - - - -"
Debug "return = "+Str(EvalWildCardsStringMatch("abc_def-ghi.,;jkl","?*a",1))
Debug "- - - - -"
Debug "return = "+Str(EvalWildCardsStringMatch("abc_def-ghi.,;jkl","*1",1))
Debug "- - - - -"
Debug "return = "+Str(EvalWildCardsStringMatch("abc_def-ghi.,;jkl","*?a",1))
Debug "- - - - -"
Debug "return = "+Str(EvalWildCardsStringMatch("abc_def-ghi.,;jkl","defg",1))
Debug "- - - - -"
Debug "return = "+Str(EvalWildCardsStringMatch("w ind ind","wind",0))
Debug "- - - - -"
Debug "return = "+Str(EvalWildCardsStringMatch("w ind ind","wind&",0))
Debug "- - - - -"
Debug "return = "+Str(EvalWildCardsStringMatch("abc","a*???",0))
Debug "- - - - -"
Debug "return = "+Str(EvalWildCardsStringMatch("ab..abc","*.??",0))
Debug "- - - - -"
Debug "return = "+Str(EvalWildCardsStringMatch("ab.abc","*.????",0))
Debug "- - - - -"
Debug "return = "+Str(EvalWildCardsStringMatch("a&b/|c","a/&b&///&c",0))
Debug "- - - - -"
Debug "Should be TRUE"
Debug "return = "+Str(EvalWildCardsStringMatch("abc_def-ghi.,;jkl","*??*D*",0))
Debug "- - - - -"
Debug "return = "+Str(EvalWildCardsStringMatch("abc_def-ghi.,;jkl","?Bc*",0))
Debug "- - - - -"
Debug "return = "+Str(EvalWildCardsStringMatch("abc_def-ghi.,;jkl","*g?i.*",0))
Debug "- - - - -"
Debug "return = "+Str(EvalWildCardsStringMatch("abc_def---ghi...jkl","*-g?i.*k?",0))
Debug "- - - - -"
Debug "return = "+Str(EvalWildCardsStringMatch("abc_.jkldef---ghi..jkl","*.jkl*.jkl",0))
Debug "- - - - -"
Debug "return = "+Str(EvalWildCardsStringMatch("abc_.jkldef---ghi..jkl","~defg&~*?a&*??D*|~*-?-*",0))
Debug "- - - - -"
Debug "return = "+Str(EvalWildCardsStringMatch("ab1c2_","*ab#c#_*",0))
Debug "- - - - -"
Debug "return = "+Str(EvalWildCardsStringMatch("ab.abc","*.???",0))
Debug "- - - - -"
Debug "return = "+Str(EvalWildCardsStringMatch("ab..abc","*.???",0))
Debug "- - - - -"
Debug "return = "+Str(EvalWildCardsStringMatch("ab...abc","*.???",0))
Debug "- - - - -"
Debug "return = "+Str(EvalWildCardsStringMatch("/~b...abc","//~*.???",0))
Debug "- - - - -"
Debug "return = "+Str(EvalWildCardsStringMatch("a&b|c","a/&b/|c",0))
Debug "- - - - -"
Debug "return = "+Str(EvalWildCardsStringMatch("a&b/|c","a&b&///|c",0))
Debug "- - - - -"
Debug "return = "+Str(EvalWildCardsStringMatch("a&b|c","a/&b|c/",0))
Debug "- - - - -"
Debug "return = "+Str(EvalWildCardsStringMatch("a&b|c","~~c",0))
Debug "- - - - -"
Debug "return = "+Str(EvalWildCardsStringMatch("a&b|c","",0))