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 |