aboutsummaryrefslogtreecommitdiff
path: root/libjava/gnu/gcj/convert/Output_JavaSrc.java
diff options
context:
space:
mode:
authorTom Tromey <tromey@gcc.gnu.org>1999-04-07 14:42:40 +0000
committerTom Tromey <tromey@gcc.gnu.org>1999-04-07 14:42:40 +0000
commitee9dd3721be68b9fa63dea9aa5a1d86e66958cde (patch)
treed96801a16fdf03a5682ef98730fe333a46eef944 /libjava/gnu/gcj/convert/Output_JavaSrc.java
parent140fa895c6b859f827fc4437b91775a82cd105fb (diff)
downloadgcc-ee9dd3721be68b9fa63dea9aa5a1d86e66958cde.zip
gcc-ee9dd3721be68b9fa63dea9aa5a1d86e66958cde.tar.gz
gcc-ee9dd3721be68b9fa63dea9aa5a1d86e66958cde.tar.bz2
Initial revision
From-SVN: r26263
Diffstat (limited to 'libjava/gnu/gcj/convert/Output_JavaSrc.java')
-rw-r--r--libjava/gnu/gcj/convert/Output_JavaSrc.java82
1 files changed, 82 insertions, 0 deletions
diff --git a/libjava/gnu/gcj/convert/Output_JavaSrc.java b/libjava/gnu/gcj/convert/Output_JavaSrc.java
new file mode 100644
index 0000000..aa23361
--- /dev/null
+++ b/libjava/gnu/gcj/convert/Output_JavaSrc.java
@@ -0,0 +1,82 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ 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 Unicode to Ascii with \ u XXXX-escapes. */
+
+public class Output_JavaSrc extends UnicodeToBytes
+{
+ public String getName() { return "JavaSrc"; }
+
+ // Number of bytes remaining before pending_char has been written.
+ int todo;
+ int pending_char;
+
+ public int write (char[] inbuffer, int inpos, int inlength)
+ {
+ int start_pos = inpos;
+ int avail = buf.length - count;
+ for (;;)
+ {
+ if (avail == 0)
+ break;
+ switch (todo)
+ {
+ case 1:
+ if (pending_char == '\\')
+ {
+ buf[count++] = (byte) '\\';
+ avail--;
+ todo = 0;
+ continue;
+ }
+ /* ... else fall through ... */
+ case 2:
+ case 3:
+ case 4:
+ todo--;
+ int digit = ((int) pending_char >> (todo * 4)) & 0xF;
+ buf[count++] = (byte) Character.forDigit(digit, 16);
+ avail--;
+ continue;
+ case 5:
+ buf[count++] = (byte) 'u';
+ avail--;
+ todo = 4;
+ continue;
+ default:
+ ;
+ }
+ if (inlength == 0)
+ break;
+ char ch = inbuffer[inpos++];
+ inlength--;
+ if (ch == '\\')
+ {
+ buf[count++] = (byte) '\\';
+ pending_char = ch;
+ todo = 1;
+ avail--;
+ }
+ else if (ch < 127)
+ {
+ buf[count++] = (byte) ch;
+ avail--;
+ }
+ else
+ {
+ buf[count++] = (byte) '\\';
+ pending_char = ch;
+ todo = 5;
+ avail--;
+ }
+ }
+ return inpos - start_pos;
+ }
+}