natCollator.cc 1.49 KB
Newer Older
Tom Tromey committed
1 2
// natCollator.cc - Native code for collation.

3
/* Copyright (C) 1999  Free Software Foundation
Tom Tromey committed
4 5 6 7 8 9 10 11 12 13 14

   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>

Tom Tromey committed
15
#include <gcj/cni.h>
Tom Tromey committed
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
#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;
    }

33
  const struct decomp_entry *base;
Tom Tromey committed
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
  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);
    }
}