| /* |
| * Copyright 2000-2012 JetBrains s.r.o. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.intellij.lang.properties.charset; |
| |
| /** |
| * @author Alexey |
| */ |
| |
| import java.nio.charset.CharsetEncoder; |
| import java.nio.charset.CoderResult; |
| import java.nio.charset.Charset; |
| import java.nio.CharBuffer; |
| import java.nio.ByteBuffer; |
| import java.nio.BufferUnderflowException; |
| import java.nio.BufferOverflowException; |
| |
| class Native2AsciiCharsetEncoder extends CharsetEncoder { |
| |
| @SuppressWarnings("UseOfArchaicSystemPropertyAccessors") |
| private static final char ANCHOR = Boolean.getBoolean("idea.native2ascii.lowercase") ? 'a' : 'A'; |
| |
| private final Charset myBaseCharset; |
| |
| public Native2AsciiCharsetEncoder(Native2AsciiCharset charset) { |
| super(charset, 1, 6); |
| myBaseCharset = charset.getBaseCharset(); |
| } |
| |
| protected CoderResult encodeLoop(CharBuffer in, ByteBuffer out) { |
| while (in.position() < in.limit()) { |
| in.mark(); |
| try { |
| char c = in.get(); |
| if (c < '\u0080') { |
| ByteBuffer byteBuffer = myBaseCharset.encode(Character.toString(c)); |
| out.put(byteBuffer); |
| } |
| else { |
| if (out.remaining() < 6) throw new BufferOverflowException(); |
| out.put((byte)'\\'); |
| out.put((byte)'u'); |
| out.put(toHexChar(c >> 12)); |
| out.put(toHexChar((c >> 8) & 0xf)); |
| out.put(toHexChar((c >> 4) & 0xf)); |
| out.put(toHexChar(c & 0xf)); |
| } |
| } |
| catch (BufferUnderflowException e) { |
| in.reset(); |
| } |
| catch (BufferOverflowException e) { |
| in.reset(); |
| return CoderResult.OVERFLOW; |
| } |
| } |
| return CoderResult.UNDERFLOW; |
| } |
| |
| private static byte toHexChar(int digit) { |
| if (digit < 10) { |
| return (byte)('0' + digit); |
| } |
| return (byte)(ANCHOR - 10 + digit); |
| } |
| } |