User: olegnitz
  Date: 01/08/09 11:56:51

  Modified:    src/main/org/jboss/ejb/plugins/cmp/ejbql NumberState.java
  Log:
  Implemented processing of hex and octal literals with the sign bit.
  
  Revision  Changes    Path
  1.2       +38 -4     jboss/src/main/org/jboss/ejb/plugins/cmp/ejbql/NumberState.java
  
  Index: NumberState.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/ejbql/NumberState.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- NumberState.java  2001/08/09 05:20:49     1.1
  +++ NumberState.java  2001/08/09 18:56:51     1.2
  @@ -176,12 +176,46 @@
                        // chop off the suffix
                        number = number.substring(0, number.length()-1);
                        System.out.println("decode long number ["+number+"]");
  -                     return new ExactNumericToken(Long.decode(number).longValue()); 
  -             } else { 
  -                     return new 
ExactNumericToken(Integer.decode(number.toUpperCase()).intValue()); 
  +                     return new ExactNumericToken(Long.decode(number).longValue());
  +             } else {
  +                     return new 
ExactNumericToken(Integer.decode(number.toUpperCase()).intValue());
                }
        }
  -     
  +    private ExactNumericLiteral createExactNumericLiteral(String number) throws 
IOException {
  +        byte first; // first digit
  +
  +        // long suffix
  +        if(number.endsWith("l") || number.endsWith("L")) {
  +            // chop off the suffix
  +            number = number.substring(0, number.length() - 1);
  +            System.out.println("decode long number [" + number + "]");
  +            if (number.startsWith("0X") || number.startsWith("0x")) {  // hex
  +                // handle literals from 0x8000000000000000L to 0xffffffffffffffffL:
  +                // remove sign bit, parse as positive, then calculate the negative 
value with the sign bit
  +                if (number.length() == 18) {
  +                    first = Byte.decode(number.substring(0, 3)).byteValue();
  +                    if (first >= 8) {
  +                        number = "0x" + (first - 8) + number.substring(3);
  +                        return new 
ExactNumericLiteral(Long.decode(number).longValue() - Long.MAX_VALUE - 1);
  +                    }
  +                }
  +            } else if (number.startsWith("0")) {  // octal
  +                // handle literals from 01000000000000000000000L to 
01777777777777777777777L
  +                // remove sign bit, parse as positive, then calculate the negative 
value with the sign bit
  +                if (number.length() == 23) {
  +                    if (number.charAt(1) == '1') {
  +                        number = "0" + number.substring(2);
  +                        return new 
ExactNumericLiteral(Long.decode(number).longValue() - Long.MAX_VALUE - 1);
  +                    }
  +                }
  +            }
  +            return new ExactNumericLiteral(Long.decode(number).longValue());
  +        } else {
  +            // integer hex and octal literals like 0xffffffff are handled by 
Long.decode()
  +            return new ExactNumericLiteral(Long.decode(number).intValue());
  +        }
  +    }
  +
        private ApproximateNumericToken createApproximateNumericToken(String number) 
throws IOException {
                // float suffix
                if(number.endsWith("f") || number.endsWith("F")) {
  
  
  

_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
http://lists.sourceforge.net/lists/listinfo/jboss-development

Reply via email to