1 /************************************************************************/
4 /************************************************************************/
5 #ifndef __TEXT_READER_H_B2D9DE8F_8730_436C_9F0A_219EE6D78352__
6 #define __TEXT_READER_H_B2D9DE8F_8730_436C_9F0A_219EE6D78352__
13 template<typename ReaderType
>
17 typedef enum {ASCII
, UTF8
, LE16
, BE16
, ANSI
} Encoding
;
18 TextReader(ReaderType
&reader
, Encoding encoding
): _inner_reader(reader
),_encoding(encoding
)
23 bool ReadLine( CStringW
* str
)
25 if(str
==NULL
) return false;
31 if(_encoding
== ASCII
|| _encoding
== ANSI
)
35 while( _inner_reader
.Read(&c
, sizeof(c
)) == sizeof(c
) )
38 if(c
== '\r') continue;
42 *str
= CStringW(CString(stra
)); // TODO: codepage
44 else if(_encoding
== UTF8
)
47 while(_inner_reader
.Read(&b
, sizeof(b
)) == sizeof(b
))
51 if(!(b
&0x80)) // 0xxxxxxx
55 else if((b
&0xe0) == 0xc0) // 110xxxxx 10xxxxxx
58 if(_inner_reader
.Read(&b
, sizeof(b
)) != sizeof(b
)) break;
61 else if((b
&0xf0) == 0xe0) // 1110xxxx 10xxxxxx 10xxxxxx
64 if(_inner_reader
.Read(&b
, sizeof(b
)) != sizeof(b
)) break;
66 if(_inner_reader
.Read(&b
, sizeof(b
)) != sizeof(b
)) break;
69 if(c
== '\r') continue;
74 else if(_encoding
== LE16
)
77 while(_inner_reader
.Read(&wc
, sizeof(wc
)) == sizeof(wc
))
80 if(wc
== '\r') continue;
85 else if(_encoding
== BE16
)
88 while(_inner_reader
.Read(&wc
, sizeof(wc
)) == sizeof(wc
))
91 wc
= ((wc
>>8)&0x00ff)|((wc
<<8)&0xff00);
92 if(wc
== '\r') continue;
100 int GetEncoding() const { return _encoding
; }
103 ReaderType
& _inner_reader
;
107 } //namespace xy_utils
109 #endif // end of __TEXT_READER_H_B2D9DE8F_8730_436C_9F0A_219EE6D78352__