OSDN Git Service

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