OSDN Git Service

デフォルトバッファサイズの定数化
[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     private static final int DEF_BUF_SZ = 128;\r
19 \r
20 \r
21     /**\r
22      * コンストラクタ。\r
23      * 長さ0で空の{@link DecodedContent}がセットされる。\r
24      */\r
25     public ContentBuilderUCS2(){\r
26         this(DEF_BUF_SZ);\r
27         return;\r
28     }\r
29 \r
30     /**\r
31      * コンストラクタ。\r
32      * 長さ0で空の{@link DecodedContent}がセットされる。\r
33      * @param capacity 初期容量\r
34      * @throws NegativeArraySizeException 容量指定が負。\r
35      */\r
36     public ContentBuilderUCS2(int capacity)\r
37             throws NegativeArraySizeException{\r
38         super(capacity);\r
39         initImpl();\r
40         return;\r
41     }\r
42 \r
43 \r
44     /**\r
45      * サロゲートペア文字(上位,下位)をUTF-16BEバイト列に変換する。\r
46      * @param ch 文字\r
47      * @return UTF-8バイト列\r
48      */\r
49     public static byte[] charToUTF16(char ch){\r
50         byte[] result = new byte[2];\r
51         result[0] = (byte)(ch >> 8);\r
52         result[1] = (byte)(ch & 0xff);\r
53 \r
54         return result;\r
55     }\r
56 \r
57 \r
58     /**\r
59      * デコード処理の初期化下請。\r
60      */\r
61     private void initImpl(){\r
62         this.content.init();\r
63         return;\r
64     }\r
65 \r
66     /**\r
67      * デコード処理の初期化。\r
68      */\r
69     @Override\r
70     protected void init(){\r
71         initImpl();\r
72         return;\r
73     }\r
74 \r
75     /**\r
76      * {@inheritDoc}\r
77      * @param seq {@inheritDoc}\r
78      * @throws DecodeException {@inheritDoc}\r
79      */\r
80     @Override\r
81     public void charContent(CharSequence seq)\r
82             throws DecodeException{\r
83         flushError();\r
84 \r
85         int length = seq.length();\r
86         int startPos = 0;\r
87 \r
88         for(int pos = 0; pos < length; pos++){\r
89             char ch = seq.charAt(pos);\r
90 \r
91             if(   ! Character.isHighSurrogate(ch)\r
92                && ! Character.isLowSurrogate (ch) ){\r
93                 continue;\r
94             }\r
95 \r
96             if(startPos < pos){\r
97                 CharSequence chopped = seq.subSequence(startPos, pos);\r
98                 this.content.append(chopped);\r
99                 startPos = pos + 1;\r
100             }\r
101 \r
102             byte[] barr = charToUTF16(ch);\r
103             for(byte bval : barr){\r
104                 this.content.addDecodeError(bval);\r
105             }\r
106         }\r
107 \r
108         if(startPos < length){\r
109             CharSequence chopped = seq.subSequence(startPos, length);\r
110             this.content.append(chopped);\r
111         }\r
112 \r
113         return;\r
114     }\r
115 \r
116     /**\r
117      * {@inheritDoc}\r
118      * @param errorArray {@inheritDoc}\r
119      * @param offset {@inheritDoc}\r
120      * @param length {@inheritDoc}\r
121      * @throws DecodeException {@inheritDoc}\r
122      */\r
123     @Override\r
124     public void decodingError(byte[] errorArray, int offset, int length)\r
125             throws DecodeException{\r
126         int limit = offset + length;\r
127 \r
128         for(int bpos = offset; bpos < limit; bpos++){\r
129             byte bval = errorArray[bpos];\r
130             this.content.addDecodeError(bval);\r
131         }\r
132 \r
133         return;\r
134     }\r
135 \r
136 }\r