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