private void openScope(byte opener) throws IOException { out.append(opener); level++; head = true; }
private void encodeNIX() throws IOException { out.write(NULL); }
private void encodeBOOL(boolean value) throws IOException { out.write(value ? TRUE : FALSE); }
private void encodeDATA(byte[] value) throws IOException { int len = value.length * 2 + 4; byte [] data = new byte[len]; int p = 0; data[p++] = '"'; data[p++] = '0'; data[p++] = 'x'; for (int pos = 0; pos < value.length; pos++) { data[p++] = HEX[(value[pos] >> 4) & 0xf]; data[p++] = HEX[value[pos] & 0xf]; } data[p] = '"'; out.append(data, 0, len); }
private void encodeLONG(long value) throws IOException { out.write(value); }
private void encodeSTRING(byte[] value) throws IOException { byte [] data = new byte[value.length * 6 + 2]; int len = 2; int p = 0; data[p++] = '"'; for (int pos = 0; pos < value.length; pos++) { byte c = value[pos]; switch (c) { case '"': data[p++] = '\\'; data[p++] = '"'; len += 2; break; case '\\': data[p++] = '\\'; data[p++] = '\\'; len += 2; break; case '\b': data[p++] = '\\'; data[p++] = 'b'; len += 2; break; case '\f': data[p++] = '\\'; data[p++] = 'f'; len += 2; break; case '\n': data[p++] = '\\'; data[p++] = 'n'; len += 2; break; case '\r': data[p++] = '\\'; data[p++] = 'r'; len += 2; break; case '\t': data[p++] = '\\'; data[p++] = 't'; len += 2; break; default: if (c > 0x1f || c < 0) { data[p++] = c; len++; } else { // requires escaping according to RFC 4627 data[p++] = '\\'; data[p++] = 'u'; data[p++] = '0'; data[p++] = '0'; data[p++] = HEX[(c >> 4) & 0xf]; data[p++] = HEX[c & 0xf]; len += 6; } } } data[p] = '"'; out.append(data, 0, len); }
private void closeScope(byte closer) throws IOException { level--; separate(false); out.append(closer); }
public void field(String name, Inspector inspector) { try { separate(true); encodeSTRING(Utf8Codec.encode(name)); out.append((byte)':'); if (!compact) out.append((byte)' '); encodeValue(inspector); } catch (Exception e) { // FIXME: Should we fix ArrayTraverser/ObjectTraverser API or do something more fancy here? e.printStackTrace(); } } }