10 #include "InputStream.h"
16 // inputstreamの準備が出来ていない場合に送出される例外
17 class StreamException : public std::exception
20 StreamException(const std::string& str) : str_(str) {}
21 virtual ~StreamException() throw() {}
23 const char* what() throw() {
31 class UTF8InputStream : public IInputStream
34 入力ストリームから、UTF-8のデータを指定した文字だけ読みだして
38 const unsigned char EOF_;
42 // 入力に利用するストリームは最初に渡される。
43 // 最初に渡さない場合には、後から開けるようにしておかなけりゃならない。
45 UTF8InputStream(smart_ptr<std::istream> strm);
46 virtual ~UTF8InputStream(){}
48 bool open(smart_ptr<std::istream> strm);
50 std::vector<unsigned char> read();
51 std::vector<unsigned char> read(int num);
53 std::vector<unsigned char> peek();
54 std::vector<unsigned char> peek(int num);
57 size_t pos() const {return pos_;}
59 // 渡したvectorをストリームに戻す。vectorは、readで取得した
60 // データの並びでなければならない。つまり、read()した
62 void unget(const std::vector<unsigned char>& ch);
64 // ファイルの終端に到達しているかどうかを返す。
65 // trueを返す場合、readの結果は常にEOF文字を返す。
70 smart_ptr<std::istream> strm_;
75 // UTF-8のコードを表すバイト列をUTF-8のコードに変換する。
76 long generateUTF8Code(const std::vector<unsigned char>& code);
77 long generateUTF8Code(const std::string& ch);
81 // UTF8の先頭バイト以外であるかどうかをチェックする。
82 const unsigned char checker;
84 CheckUTF8Byte() : checker(0x2), good(true) {}
87 void operator()(const T& t) {
88 // 先頭ビットが10ではない場合、チェックに失敗する。
90 if ( ((tmp & 0x3)) != checker) {
98 // 渡されたデータをistreamにputbackする。
99 smart_ptr<std::istream> strm_;
100 PutBack(smart_ptr<std::istream> strm) : strm_(strm) {}
109 // 与えられたバイト列の先頭から、UTF8一文字に該当しているかどうかを返す。
110 // バイト列がUTF8に該当する場合、そのバイト列のサイズを返す。
111 bool is_utf8_one(const std::vector<unsigned char>& bytes, size_t& size);
113 // 与えられたバイト列全てが、UTF8に該当しているかどうかを返す。
114 bool is_utf8_all(const std::vector<unsigned char>& bytes);
116 // UTF-8の先頭バイトとして正しいフォーマットであるかどうか。
117 // 正しいフォーマットである場合、渡したバイトを含めた、一文字である
119 bool is_utf8_first_byte(unsigned char c, size_t& size);
121 // 渡したバイト列が、0-9で判別される数値文字と一致するかどうかを返す。
122 // is_asciiのサブセットを判別するものである。
123 bool is_utf8_numeric(const std::vector<unsigned char>& bytes);
125 // 渡したバイト列が、a-zA-Zの領域であるかどうかを調べる。
126 // is_asciiのサブセットを判別するものである。
127 bool is_utf8_alpha(const std::vector<unsigned char>& bytes);
129 // 渡したバイト列が、0x00〜0x7fの領域であるかどうかを返す。
130 // is_utf8_alpha, is_utf8_numericのスーパーセットとなる。
131 bool is_utf8_ascii(const std::vector<unsigned char>& bytes);
135 #endif /* _UTF8_H_ */