]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/classes/translit/src/com/ibm/icu/text/UppercaseTransliterator.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / classes / translit / src / com / ibm / icu / text / UppercaseTransliterator.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 1996-2010, International Business Machines Corporation and    *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  */\r
7 package com.ibm.icu.text;\r
8 \r
9 import java.io.IOException;\r
10 \r
11 import com.ibm.icu.impl.UCaseProps;\r
12 import com.ibm.icu.util.ULocale;\r
13 \r
14 /**\r
15  * A transliterator that performs locale-sensitive toUpper()\r
16  * case mapping.\r
17  */\r
18 class UppercaseTransliterator extends Transliterator {\r
19 \r
20     /**\r
21      * Package accessible ID.\r
22      */\r
23     static final String _ID = "Any-Upper";\r
24     // TODO: Add variants for tr, az, lt, default = default locale\r
25 \r
26     /**\r
27      * System registration hook.\r
28      */\r
29     static void register() {\r
30         Transliterator.registerFactory(_ID, new Transliterator.Factory() {\r
31             public Transliterator getInstance(String ID) {\r
32                 return new UppercaseTransliterator(ULocale.US);\r
33             }\r
34         });\r
35     }\r
36 \r
37     private ULocale locale;\r
38 \r
39     private UCaseProps csp;\r
40     private ReplaceableContextIterator iter;\r
41     private StringBuffer result;\r
42     private int[] locCache;\r
43 \r
44     /**\r
45      * Constructs a transliterator.\r
46      */\r
47     public UppercaseTransliterator(ULocale loc) {\r
48         super(_ID, null);\r
49         locale = loc;\r
50         try {\r
51             csp=UCaseProps.getSingleton();\r
52         } catch (IOException e) {\r
53             csp=null;\r
54         }\r
55         iter=new ReplaceableContextIterator();\r
56         result = new StringBuffer();\r
57         locCache = new int[1];\r
58         locCache[0]=0;\r
59     }\r
60 \r
61     /**\r
62      * Implements {@link Transliterator#handleTransliterate}.\r
63      */\r
64     protected void handleTransliterate(Replaceable text,\r
65                                        Position offsets, boolean isIncremental) {\r
66     if(csp==null) {\r
67         return;\r
68     }\r
69 \r
70     if(offsets.start >= offsets.limit) {\r
71         return;\r
72     } \r
73 \r
74     iter.setText(text);\r
75     result.setLength(0);\r
76     int c, delta;\r
77 \r
78     // Walk through original string\r
79     // If there is a case change, modify corresponding position in replaceable\r
80 \r
81     iter.setIndex(offsets.start);\r
82     iter.setLimit(offsets.limit);\r
83     iter.setContextLimits(offsets.contextStart, offsets.contextLimit);\r
84     while((c=iter.nextCaseMapCP())>=0) {\r
85         c=csp.toFullUpper(c, iter, result, locale, locCache);\r
86 \r
87         if(iter.didReachLimit() && isIncremental) {\r
88             // the case mapping function tried to look beyond the context limit\r
89             // wait for more input\r
90             offsets.start=iter.getCaseMapCPStart();\r
91             return;\r
92         }\r
93 \r
94         /* decode the result */\r
95         if(c<0) {\r
96             /* c mapped to itself, no change */\r
97             continue;\r
98         } else if(c<=UCaseProps.MAX_STRING_LENGTH) {\r
99             /* replace by the mapping string */\r
100             delta=iter.replace(result.toString());\r
101             result.setLength(0);\r
102         } else {\r
103             /* replace by single-code point mapping */\r
104                 delta=iter.replace(UTF16.valueOf(c));\r
105             }\r
106 \r
107             if(delta!=0) {\r
108                 offsets.limit += delta;\r
109                 offsets.contextLimit += delta;\r
110             }\r
111         }\r
112         offsets.start = offsets.limit;\r
113     }\r
114 }\r