/* Copyright (C) 1999 Free Software Foundation This file is part of libgcj. This software is copyrighted work licensed under the terms of the Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ package gnu.gcj.convert; /** * Convert Ascii with \ u XXXX-escapes to Unicode. * @author Per Bothner * @date April 1999. */ public class Input_JavaSrc extends BytesToUnicode { public String getName() { return "JavaSrc"; } // 0: normal // 1: seen '\\' // 2: seen '\\' and 'u' // 3: seen '\\' and need to emit value. // 4, 5, 6, 7: seen '\\u', 'u' and (state-3) hex digits. int state = 0; int value; public int read (char[] outbuffer, int outpos, int count) { int origpos = outpos; for (;;) { if (inpos >= inlength) break; if (outpos - origpos >= count) break; char b = (char) (inbuffer[inpos++] & 0xFF); switch (state) { case 0: if (b == '\\') { state = 1; continue; } break; case 1: if (b == 'u') { state = 2; continue; } if (b != '\\') { value = b; b = '\\'; state = 3; } break; case 3: b = (char) value; break; default: // case 4: case 5: case 6: case 7: int digit = Character.digit(b, 16); if (digit < 0) { b = '\uFFFD'; state = 0; } else { value = value * 16 + digit; if (state < 7) { state++; continue; } b = (char) value; } state = 0; } outbuffer[outpos++] = b; } return outpos - origpos; } }