compare-char.js (6109B)
1 function IsASCIIAlphaString_CharCodeAt(s) { 2 for (var i = 0; i < s.length; i++) { 3 var c = s.charCodeAt(i); 4 if (!((0x41 <= c && c <= 0x5A) || (0x61 <= c && c <= 0x7A))) 5 return false; 6 } 7 return true; 8 } 9 10 function IsASCIIAlphaString_CharAt(s) { 11 for (var i = 0; i < s.length; i++) { 12 var c = s.charAt(i); 13 if (!(("A" <= c && c <= "Z") || ("a" <= c && c <= "z"))) 14 return false; 15 } 16 return true; 17 } 18 19 function IsASCIIAlphaString_GetElem(s) { 20 for (var i = 0; i < s.length; i++) { 21 var c = s[i]; 22 if (!(("A" <= c && c <= "Z") || ("a" <= c && c <= "z"))) 23 return false; 24 } 25 return true; 26 } 27 28 function IsASCIIAlphaString_GetElem_GetElem(s) { 29 var range = "AZaz"; 30 for (var i = 0; i < s.length; i++) { 31 var c = s[i]; 32 if (!((range[0] <= c && c <= range[1]) || (range[2] <= c && c <= range[3]))) 33 return false; 34 } 35 return true; 36 } 37 38 function IsGreekOrCyrillicString_CharCodeAt(s) { 39 // U+0370 (GREEK CAPITAL LETTER HETA) 40 // U+03FF (GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL) 41 // U+0400 (CYRILLIC CAPITAL LETTER IE WITH GRAVE) 42 // U+052F (CYRILLIC SMALL LETTER EL WITH DESCENDER) 43 for (var i = 0; i < s.length; i++) { 44 var c = s.charCodeAt(i); 45 if (!((0x0370 <= c && c <= 0x03FF) || (0x400 <= c && c <= 0x052F))) 46 return false; 47 } 48 return true; 49 } 50 51 function IsGreekOrCyrillicString_CharAt(s) { 52 for (var i = 0; i < s.length; i++) { 53 var c = s.charAt(i); 54 if (!(("Ͱ" <= c && c <= "Ͽ") || ("Ѐ" <= c && c <= "ԯ"))) 55 return false; 56 } 57 return true; 58 } 59 60 function IsGreekOrCyrillicString_GetElem(s) { 61 for (var i = 0; i < s.length; i++) { 62 var c = s[i]; 63 if (!(("Ͱ" <= c && c <= "Ͽ") || ("Ѐ" <= c && c <= "ԯ"))) 64 return false; 65 } 66 return true; 67 } 68 69 function IsGreekOrCyrillicString_GetElem_GetElem(s) { 70 var range = "ͰϿЀԯ"; 71 for (var i = 0; i < s.length; i++) { 72 var c = s[i]; 73 if (!((range[0] <= c && c <= range[1]) || (range[2] <= c && c <= range[3]))) 74 return false; 75 } 76 return true; 77 } 78 79 function main() { 80 function compareLatin1() { 81 var strings = ["ABCABCABC", "abcabcabc"]; 82 var compare = "aAbD"; 83 var q = 0; 84 for (var i = 0; i < 200; ++i) { 85 var str = strings[i & 1]; 86 for (var j = 0; j < str.length; ++j) { 87 if (str[j] === "a") 88 q++; 89 if ("A" == str[j]) 90 q++; 91 if (str[j] != "b") 92 q++; 93 if ("D" !== str[j]) 94 q++; 95 if (str[j] === compare[0]) 96 q++; 97 if (compare[1] == str[j]) 98 q++; 99 if (str[j] != compare[2]) 100 q++; 101 if (compare[3] !== str[j]) 102 q++; 103 } 104 } 105 assertEq(q, 100*3*2 + 100*3*2 + 100*15*2 + 100*18*2); 106 } 107 function compareTwoByte() { 108 var strings = ["āĉœāĉœāĉœ", "abcabcabc"]; 109 var compare = "œĉāƉ"; 110 var q = 0; 111 for (var i = 0; i < 200; ++i) { 112 var str = strings[i & 1]; 113 for (var j = 0; j < str.length; ++j) { 114 if ("œ" === str[j]) 115 q++; 116 if (str[j] == "ĉ") 117 q++; 118 if ("ā" != str[j]) 119 q++; 120 if (str[j] !== "Ɖ") 121 q++; 122 if (compare[0] === str[j]) 123 q++; 124 if (str[j] == compare[1]) 125 q++; 126 if (compare[2] != str[j]) 127 q++; 128 if (str[j] !== compare[3]) 129 q++; 130 } 131 } 132 assertEq(q, 100*3*2 + 100*3*2 + 100*15*2 + 100*18*2); 133 } 134 function compareRangeLatin1() { 135 var strings = [ 136 "ABCABCABC", // all upper 137 "abcabcabc", // all lower 138 "abcABCabc", // lower and upper 139 "abcabc123", // characters below limit 140 "abc[_]ABC", // characters between limit 141 "ABC{|}abc", // characters above limit 142 "!#$456_~ÿ", // no matches at all 143 "aBcZyyZUU", // - 144 ]; 145 for (var i = 0; i < 200; ++i) { 146 var str = strings[i & 7]; 147 var resultCharCodeAt = IsASCIIAlphaString_CharCodeAt(str); 148 var resultCharAt = IsASCIIAlphaString_CharAt(str); 149 var resultGetElem = IsASCIIAlphaString_GetElem(str); 150 var resultGetElemGetElem = IsASCIIAlphaString_GetElem_GetElem(str); 151 152 assertEq(resultCharAt, resultCharCodeAt); 153 assertEq(resultGetElem, resultCharCodeAt); 154 assertEq(resultGetElemGetElem, resultCharCodeAt); 155 } 156 } 157 function compareRangeTwoByte() { 158 var strings = [ 159 "αβγΑΒΓαβγ", // all Greek 160 "АБВабвАБВ", // all Cyrillic 161 "αβγабвАБΓ", // Greek and Cyrillic 162 "αβγāēōАБВ", // characters below limit 163 "αβγԱԲԳАБВ", // characters above limit 164 "abcāēōԱԲԳ", // no matches at all 165 "𝐀𝐁𝐂𝐀𝐁𝐂𝐀𝐁𝐂", // (non-BMP) 166 "abcabcabc", // - 167 ]; 168 for (var i = 0; i < 200; ++i) { 169 var str = strings[i & 7]; 170 var resultCharCodeAt = IsGreekOrCyrillicString_CharCodeAt(str); 171 var resultCharAt = IsGreekOrCyrillicString_CharAt(str); 172 var resultGetElem = IsGreekOrCyrillicString_GetElem(str); 173 var resultGetElemGetElem = IsGreekOrCyrillicString_GetElem_GetElem(str); 174 175 assertEq(resultCharAt, resultCharCodeAt); 176 assertEq(resultGetElem, resultCharCodeAt); 177 assertEq(resultGetElemGetElem, resultCharCodeAt); 178 } 179 } 180 181 compareLatin1(); 182 compareTwoByte(); 183 compareRangeLatin1(); 184 compareRangeTwoByte(); 185 } 186 187 for (var i = 0; i < 15; ++i) { 188 main(); 189 }