OSDN Git Service

4a338c01750b8be00ef9d428a5a8d2209af62b56
[jindolf/JinParser.git] / src / main / java / jp / sourceforge / jindolf / parser / ContentBuilderUCS2.java
1 /*\r
2  * content builder for UTF-8 (UCS2 only)\r
3  *\r
4  * License : The MIT License\r
5  * Copyright(c) 2010 olyutorskii\r
6  */\r
7 \r
8 package jp.sourceforge.jindolf.parser;\r
9 \r
10 /**\r
11  * "UTF-8"エンコーディング用デコードハンドラ。\r
12  * {@link StreamDecoder}からの通知に従い、\r
13  * {@link DecodedContent}へとデコードする。\r
14  * UCS-4はUTF-16エラー扱い。\r
15  */\r
16 public class ContentBuilderUCS2 extends ContentBuilder{\r
17 \r
18     /**\r
19      * コンストラクタ。\r
20      * 長さ0で空の{@link DecodedContent}がセットされる。\r
21      */\r
22     public ContentBuilderUCS2(){\r
23         this(128);\r
24         return;\r
25     }\r
26 \r
27     /**\r
28      * コンストラクタ。\r
29      * 長さ0で空の{@link DecodedContent}がセットされる。\r
30      * @param capacity 初期容量\r
31      * @throws NegativeArraySizeException 容量指定が負。\r
32      */\r
33     public ContentBuilderUCS2(int capacity)\r
34             throws NegativeArraySizeException{\r
35         super(capacity);\r
36         initImpl();\r
37         return;\r
38     }\r
39 \r
40 \r
41     /**\r
42      * サロゲートペア文字(上位,下位)をUTF-16BEバイト列に変換する。\r
43      * @param ch 文字\r
44      * @return UTF-8バイト列\r
45      */\r
46     public static byte[] charToUTF16(char ch){\r
47         byte[] result = new byte[2];\r
48         result[0] = (byte)(ch >> 8);\r
49         result[1] = (byte)(ch & 0xff);\r
50 \r
51         return result;\r
52     }\r
53 \r
54 \r
55     /**\r
56      * デコード処理の初期化下請。\r
57      */\r
58     private void initImpl(){\r
59         this.content.init();\r
60         return;\r
61     }\r
62 \r
63     /**\r
64      * デコード処理の初期化。\r
65      */\r
66     @Override\r
67     protected void init(){\r
68         initImpl();\r
69         return;\r
70     }\r
71 \r
72     /**\r
73      * {@inheritDoc}\r
74      * @param seq {@inheritDoc}\r
75      * @throws DecodeException {@inheritDoc}\r
76      */\r
77     @Override\r
78     public void charContent(CharSequence seq)\r
79             throws DecodeException{\r
80         flushError();\r
81 \r
82         int length = seq.length();\r
83         int startPos = 0;\r
84 \r
85         for(int pos = 0; pos < length; pos++){\r
86             char ch = seq.charAt(pos);\r
87 \r
88             if(   ! Character.isHighSurrogate(ch)\r
89                && ! Character.isLowSurrogate (ch) ){\r
90                 continue;\r
91             }\r
92 \r
93             if(startPos < pos){\r
94                 CharSequence chopped = seq.subSequence(startPos, pos);\r
95                 this.content.append(chopped);\r
96                 startPos = pos + 1;\r
97             }\r
98 \r
99             byte[] barr = charToUTF16(ch);\r
100             for(byte bval : barr){\r
101                 this.content.addDecodeError(bval);\r
102             }\r
103         }\r
104 \r
105         if(startPos < length){\r
106             CharSequence chopped = seq.subSequence(startPos, length);\r
107             this.content.append(chopped);\r
108         }\r
109 \r
110         return;\r
111     }\r
112 \r
113     /**\r
114      * {@inheritDoc}\r
115      * @param errorArray {@inheritDoc}\r
116      * @param offset {@inheritDoc}\r
117      * @param length {@inheritDoc}\r
118      * @throws DecodeException {@inheritDoc}\r
119      */\r
120     @Override\r
121     public void decodingError(byte[] errorArray, int offset, int length)\r
122             throws DecodeException{\r
123         int limit = offset + length;\r
124 \r
125         for(int bpos = offset; bpos < limit; bpos++){\r
126             byte bval = errorArray[bpos];\r
127             this.content.addDecodeError(bval);\r
128         }\r
129 \r
130         return;\r
131     }\r
132 \r
133 }\r