aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authorTom Tromey <tromey@cygnus.com>1999-04-26 15:42:52 +0000
committerTom Tromey <tromey@gcc.gnu.org>1999-04-26 15:42:52 +0000
commit6c26973039ecae250cd9c29d4546f7669ecce6be (patch)
tree29901def3a4f1c0259ccf96db19556c02467fb8b /libjava
parent3cc26081445329aec4d4711d69c0d86e05af841b (diff)
downloadgcc-6c26973039ecae250cd9c29d4546f7669ecce6be.zip
gcc-6c26973039ecae250cd9c29d4546f7669ecce6be.tar.gz
gcc-6c26973039ecae250cd9c29d4546f7669ecce6be.tar.bz2
* natCollator.cc: New file.
From-SVN: r26655
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog2
-rw-r--r--libjava/java/text/natCollator.cc74
2 files changed, 76 insertions, 0 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index af7aa2e..67160b8 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,5 +1,7 @@
1999-04-26 Tom Tromey <tromey@cygnus.com>
+ * natCollator.cc: New file.
+
* java/util/GregorianCalendar.java (setDefaultTime): New method.
(GregorianCalendar): Use it in all constructors.
* java/util/Calendar.java (Calendar): Changed argument name to
diff --git a/libjava/java/text/natCollator.cc b/libjava/java/text/natCollator.cc
new file mode 100644
index 0000000..7624b7c
--- /dev/null
+++ b/libjava/java/text/natCollator.cc
@@ -0,0 +1,74 @@
+// natCollator.cc - Native code for collation.
+
+/* 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. */
+
+// Written by Tom Tromey <tromey@cygnus.com>.
+
+#include <config.h>
+
+#include <cni.h>
+#include <jvm.h>
+
+#include <java/text/Collator.h>
+#include <java/lang/StringBuffer.h>
+
+#include <java-chardecomp.h>
+
+void
+java::text::Collator::decomposeCharacter (jchar c,
+ java::lang::StringBuffer *buf)
+{
+ if (decmp == NO_DECOMPOSITION)
+ {
+ buf->append(c);
+ return;
+ }
+
+ struct decomp_entry *base;
+ int high;
+
+ if (decmp == FULL_DECOMPOSITION)
+ {
+ base = full_decomposition;
+ high = sizeof (full_decomposition) / sizeof (struct decomp_entry);
+ }
+ else
+ {
+ base = canonical_decomposition;
+ high = sizeof (canonical_decomposition) / sizeof (struct decomp_entry);
+ }
+
+ // FIXME: this is probably a bit slow for the task at hand.
+ int i = high / 2;
+ int low = 0;
+ while (true)
+ {
+ if (c < base[i].key)
+ high = i;
+ else if (c > base[i].key)
+ low = i;
+ else
+ break;
+
+ int old = i;
+ i = (high + low) / 2;
+ if (i == old)
+ {
+ // Not in table, so it expands to itself.
+ buf->append(c);
+ return;
+ }
+ }
+
+ for (int j = 0; base[i].value[j] != '\0'; j += 2)
+ {
+ jchar x = (base[i].value[j] << 8) | (base[i].value[j + 1]);
+ buf->append (x);
+ }
+}