Changeset 7083
- Timestamp:
- 11/15/16 20:04:04 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
FCSSimpleEndpoint/trunk/src/main/java/eu/clarin/sru/server/fcs/parser/QueryParser.java
r7082 r7083 799 799 800 800 private static String unescapeString(String s) { 801 StringBuilder sb = new StringBuilder(); 801 /* 802 * buffer to store chars by Character.toChars; pre-allocate to avoid 803 * allocation for every codepoint. 804 */ 805 final char[] buf = new char[2]; 806 807 final StringBuilder sb = new StringBuilder(); 802 808 for (int i = 0; i < s.length(); i++) { 803 809 int cp = s.codePointAt(i); … … 810 816 sb.append("\\"); 811 817 break; 812 case '"': /* double quote */818 case '"': /* double quote */ 813 819 sb.append("\""); 814 820 break; 815 case '\'': /* single-quote */821 case '\'': /* single quote */ 816 822 sb.append("'"); 817 823 break; 818 case 'n': /* new line */824 case 'n': /* new line */ 819 825 sb.append("\n"); 820 826 break; 821 case 't': /* tabulator */827 case 't': /* tabulator */ 822 828 sb.append("\t"); 823 829 break; 824 case 'x': 825 i = unescapeUnicode(s, i, 2, sb );830 case 'x': /* x HEX HEX */ 831 i = unescapeUnicode(s, i, 2, sb, buf); 826 832 break; 827 case 'u': 828 i = unescapeUnicode(s, i, 4, sb );833 case 'u': /* u HEX HEX HEX HEX */ 834 i = unescapeUnicode(s, i, 4, sb, buf); 829 835 break; 830 case 'U': 831 i = unescapeUnicode(s, i, 8, sb );836 case 'U': /* U HEX HEX HEX HEX HEX HEX HEX HEX */ 837 i = unescapeUnicode(s, i, 8, sb, buf); 832 838 break; 833 839 } 834 840 } else { 835 841 try { 836 sb.append(Character.toChars(cp)); 842 final int len = Character.toChars(cp, buf, 0); 843 sb.append(buf, 0, len); 837 844 } catch (IllegalArgumentException e) { 838 845 throw new ExpressionTreeBuilderException( 839 "invalid codepoint: 0x" + Integer.toHexString(cp)); 846 "invalid codepoint: 0x" + 847 Integer.toHexString(cp).toUpperCase()); 840 848 } 841 849 } … … 846 854 847 855 private static final int unescapeUnicode(String s, int i, int size, 848 StringBuilder sb ) {856 StringBuilder sb, char[] buf) { 849 857 if ((s.length() - i - 1) >= size) { 850 858 int cp = 0; … … 854 862 cp = cp << 4; 855 863 } 856 cp |= parseHexString(s.c harAt(i));864 cp |= parseHexString(s.codePointAt(i)); 857 865 } 858 866 try { 859 sb.append(Character.toChars(cp)); 867 final int len = Character.toChars(cp, buf, 0); 868 sb.append(buf, 0, len); 860 869 } catch (IllegalArgumentException e) { 861 870 throw new ExpressionTreeBuilderException( … … 870 879 871 880 872 private static final int parseHexString( charc) {881 private static final int parseHexString(int c) { 873 882 switch (c) { 874 883 case '0': … … 917 926 return 15; 918 927 default: 928 /* 929 * actually, this should never happen, as ANTLR's lexer should catch 930 * illegal HEX characters 931 */ 919 932 throw new ExpressionTreeBuilderException( 920 "invalud hex character: " + c); 933 "invalud hex character: " + 934 new String(Character.toChars(c))); 921 935 } 922 936 }
Note: See TracChangeset
for help on using the changeset viewer.