tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }