View difference between Paste ID: Wv8Zypwq and 2gyAAeD4
SHOW: | | - or go back to the newest paste.
1
#include "crt.bi"
2
3
function WildMatch( sWildText as string , sCompare as string , iCaseSensitive as boolean = false ) as boolean
4
  dim as integer iTxt, iCmp
5
  
6
  'if any of them is empty... then result is direct
7
  if sCompare[0] = 0 then return false  
8
  do
9
    var iCT = sWildText[iTxt] : iTxt += 1
10
    var iCC = sCompare[iCmp] : iCmp += 1 
11
    'print iTxt-1;" ";chr(iCT),iCmp-1;" ";chr(iCC)
12
    select case iCT
13
    case 0        : return iCC=0 'once it text reachs end.. it's a success
14-
    case asc(" "),asc("~") 'white space (at least 1, at least 0)
14+
    case asc("^"),asc("~") 'white space (at least 1, at least 0)
15
      dim as long iNum = 0
16
      do
17
        select case iCC
18
        case asc(" "),asc(!"\r"),asc(!"\n"),asc(!"\t") 
19
          iNum += 1 : iCC = sCompare[iCmp] : iCmp += 1
20
        case else
21-
          if iCT=asc(" ") andalso iNum=0 then return false 'must at least have one blank
21+
          if iCT=asc("^") andalso iNum=0 then return false 'must at least have one blank
22
          iCmp -= 1 : continue do,do 'continue repeating same char
23
        end select
24
      loop          
25
    case asc("?") : 'if it's a single char wild
26
      'we're done if reached end of comparsion
27
      'and it will be true if next wildtext is also done
28
      if iCC=0 then return sWildText[iTxt]=0        
29
    case asc("*")       
30
      var iCT2 = sWildText[iTxt]
31
      'if matching anything after then it will be true if it's the end of wildtext
32
      if iCT2 = 0 then return true
33
      'if is not another wildcard then must continue checking
34
      if iCT2 <> asc("?") andalso iCT2 <> asc("*") then         
35
        'if end of compare text happened then it's false!
36
        if iCC = 0 then return false
37
        'if found matching char then continue matching
38-
        if iCT2 = asc(" ") orelse asc("~") then
38+
        if iCT2 = asc("^") orelse asc("~") then
39
          select case iCC
40
          case asc(" "),asc(!"\r"),asc(!"\n"),asc(!"\t") 
41-
            continue do
41+
            iCmp -= 1 : continue do
42
          end select
43
        elseif iCaseSensitive then
44
          if iCC=iCT2 then iTxt += 1: continue do
45
        else
46
          if ToLower(iCC)=ToLower(iCT2) then iTxt += 1: continue do
47
        end if
48
        'otherwise goes back on wildtext (to compare against *) again
49
        iTxt -= 1 : continue do
50
      end if
51
      'next is also a wildcard, so we will process that
52
    case else 'is a direct comparsion... 
53
      'if compare string finished or didnt match then we failed
54
      if iCC=0 then return false
55
      if iCaseSensitive then
56
        if iCC<>iCT then return false
57
      else
58
        if ToLower(iCC)<>ToLower(iCT) then return false
59
      end if
60
    end select
61
  loop
62
end function
63
64
#define WildMatchTest(_A,_B,_C...) WildMatch(_A,_B,_C),"'" _A "'", "'" _B "'"
65
print "Expected","Result","WildCards","Comparsion"
66
print string(60,"-")
67
print true,  WildMatchTest("Hello","Hello")
68
print false, WildMatchTest("Hell","Hello")
69
print false, WildMatchTest("Hello","Hell")
70
print false, WildMatchTest("Hello","HELLO",true)
71
print false, WildMatchTest("Hello","World")
72
print true,  WildMatchTest("B?n","Bin")
73
print true,  WildMatchTest("b?n","Ben")
74
print false, WildMatchTest("B?n","Bem")
75
print true,  WildMatchTest("*us","jealous")
76
print false, WildMatchTest("*us","jealously")
77
print true,  WildMatchTest("Bang*","Bangaloo")
78
print false, WildMatchTest("Leap*","lip")
79
print false, WildMatchTest("Bi*us","Binocculus") 'want this to be true?
80
print true,  WildMatchTest("Bi*us","Binocc?lus")
81
print true,  wildMatchTest("*cup*","Porcupine")
82
print true,  WildMatchTest("*Hi*Ta*","Hippopotamus")
83
print true,  WildMatchTest(" Hello",!"\t \t Hello")
84
print false, WildMatchTest(" Hello","Hello")
85
print true,  WildMatchTest("~Hello~;"," Hello;")
86
print true,  WildMatchTest("*~Hello;",!"World\t Hello;")
87
print true,  WildMatchTest("*^Hello;",!"World Hello;")
88
print false,  WildMatchTest("*~Hello;","WorldHello;")
89
90
sleep
91