mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			75 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
| // natCollator.cc - Native code for collation.
 | |
| 
 | |
| /* 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.  */
 | |
| 
 | |
| // Written by Tom Tromey <tromey@cygnus.com>.
 | |
| 
 | |
| #include <config.h>
 | |
| 
 | |
| #include <gcj/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;
 | |
|     }
 | |
| 
 | |
|   const 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);
 | |
|     }
 | |
| }
 |