Esempio n. 1
0
    public static int test_1_bit_index()
    {
        var t = new BitClass();

        t.setBit(0, true);
        t.setBit(3, true);
        if (t.getBit(1))
        {
            return(4);
        }
        if (!t.getBit(0))
        {
            return(5);
        }
        if (!t.getBit(3))
        {
            return(6);
        }
        return(1);
    }
 private CharProperty bitsOrSingle(BitClass bits, int ch) {
     /* Bits can only handle codepoints in [u+0000-u+00ff] range.
        Use "single" node instead of bits when dealing with unicode
        case folding for codepoints listed below.
        (1)Uppercase out of range: u+00ff, u+00b5
           toUpperCase(u+00ff) -> u+0178
           toUpperCase(u+00b5) -> u+039c
        (2)LatinSmallLetterLongS u+17f
           toUpperCase(u+017f) -> u+0053
        (3)LatinSmallLetterDotlessI u+131
           toUpperCase(u+0131) -> u+0049
        (4)LatinCapitalLetterIWithDotAbove u+0130
           toLowerCase(u+0130) -> u+0069
        (5)KelvinSign u+212a
           toLowerCase(u+212a) ==> u+006B
        (6)AngstromSign u+212b
           toLowerCase(u+212b) ==> u+00e5
     */
     //int d;
     if (ch < 256 &&
         !(has(CASE_INSENSITIVE) && has(UNICODE_CASE) &&
           (ch == 0xff || ch == 0xb5 ||
            ch == 0x49 || ch == 0x69 ||  //I and i
            ch == 0x53 || ch == 0x73 ||  //S and s
            ch == 0x4b || ch == 0x6b ||  //K and k
            ch == 0xc5 || ch == 0xe5)))  //A+ring
         return bits.add(ch, flags());
     return newSingle(ch);
 }
 private CharProperty range(BitClass bits) {
     int ch = peek();
     if (ch == '\\') {
         ch = nextEscaped();
         if (ch == 'p' || ch == 'P') { // A property
             boolean comp = (ch == 'P');
             boolean oneLetter = true;
             // Consume { if present
             ch = next();
             if (ch != '{')
                 unread();
             else
                 oneLetter = false;
             return family(oneLetter, comp);
         } else { // ordinary escape
             unread();
             ch = escape(true, true);
             if (ch == -1)
                 return (CharProperty) root;
         }
     } else {
         ch = single();
     }
     if (ch >= 0) {
         if (peek() == '-') {
             int endRange = temp[_cursor+1];
             if (endRange == '[') {
                 return bitsOrSingle(bits, ch);
             }
             if (endRange != ']') {
                 next();
                 int m = single();
                 if (m < ch)
                     throw error(new String("Illegal character range"));
                 if (has(CASE_INSENSITIVE))
                     return caseInsensitiveRangeFor(ch, m);
                 else
                     return rangeFor(ch, m);
             }
         }
         return bitsOrSingle(bits, ch);
     }
     throw error(new String("Unexpected character '"+((char)ch)+"'"));
 }
 private CharProperty clazz(boolean consume) {
     CharProperty prev = null;
     CharProperty node = null;
     BitClass bits = new BitClass();
     boolean include = true;
     boolean firstInClass = true;
     int ch = next();
     for (;;) {
         switch (ch) {
             case '^':
                 // Negates if first char in a class, otherwise literal
                 if (firstInClass) {
                     if (temp[_cursor-1] != '[')
                         break;
                     ch = next();
                     include = !include;
                     continue;
                 } else {
                     // ^ not first in class, treat as literal
                     break;
                 }
             case '[':
                 firstInClass = false;
                 node = clazz(true);
                 if (prev == null)
                     prev = node;
                 else
                     prev = union(prev, node);
                 ch = peek();
                 continue;
             case '&':
                 firstInClass = false;
                 ch = next();
                 if (ch == '&') {
                     ch = next();
                     CharProperty rightNode = null;
                     while (ch != ']' && ch != '&') {
                         if (ch == '[') {
                             if (rightNode == null)
                                 rightNode = clazz(true);
                             else
                                 rightNode = union(rightNode, clazz(true));
                         } else { // abc&&def
                             unread();
                             rightNode = clazz(false);
                         }
                         ch = peek();
                     }
                     if (rightNode != null)
                         node = rightNode;
                     if (prev == null) {
                         if (rightNode == null)
                             throw error(new String("Bad class syntax"));
                         else
                             prev = rightNode;
                     } else {
                         prev = intersection(prev, node);
                     }
                 } else {
                     // treat as a literal &
                     unread();
                     break;
                 }
                 continue;
             case 0:
                 firstInClass = false;
                 if (_cursor >= patternLength)
                     throw error(new String("Unclosed character class"));
                 break;
             case ']':
                 firstInClass = false;
                 if (prev != null) {
                     if (consume)
                         next();
                     return prev;
                 }
                 break;
             default:
                 firstInClass = false;
                 break;
         }
         node = range(bits);
         if (include) {
             if (prev == null) {
                 prev = node;
             } else {
                 if (prev != node)
                     prev = union(prev, node);
             }
         } else {
             if (prev == null) {
                 prev = node.complement();
             } else {
                 if (prev != node)
                     prev = setDifference(prev, node);
             }
         }
         ch = peek();
     }
 }