diff --git a/inc/hgl/io/TextInputStream.h b/inc/hgl/io/TextInputStream.h index de02bde..cdaead7 100644 --- a/inc/hgl/io/TextInputStream.h +++ b/inc/hgl/io/TextInputStream.h @@ -67,7 +67,7 @@ namespace hgl InputStream *input_stream; ///<输入流 - uint8 *buffer; ///<缓冲区 + char *buffer; ///<缓冲区 int32 buffer_size; ///<缓冲区大小 int32 cur_buf_size; ///<当前缓冲区大小 @@ -92,9 +92,13 @@ namespace hgl public: TextInputStream(InputStream *i,const int buf_size=HGL_SIZE_1MB); + TextInputStream(char *buf,const int buf_size); virtual ~TextInputStream() { - SAFE_CLEAR_ARRAY(buffer); + if(input_stream) //有input_stream证明是从流加载的,需要删除临时缓冲区 + { + SAFE_CLEAR_ARRAY(buffer); + } } void SetDefaultBOM(const ByteOrderMask &bo){default_bom=bo;} ///<设置缺省BOM头} diff --git a/src/IO/TextInputStream.cpp b/src/IO/TextInputStream.cpp index 9774e58..73b6780 100644 --- a/src/IO/TextInputStream.cpp +++ b/src/IO/TextInputStream.cpp @@ -16,7 +16,7 @@ namespace hgl else buffer_size=stream_size; - buffer=new uint8[buffer_size]; + buffer=new char[buffer_size]; cur_buf_size=0; bom=ByteOrderMask::NONE; @@ -28,6 +28,26 @@ namespace hgl event_callback=nullptr; } + TextInputStream::TextInputStream(char *buf,const int buf_size) + { + input_stream=nullptr; + + stream_pos=0; + stream_size=0; + + buffer=buf; + buffer_size=buf_size; + cur_buf_size=buf_size; + + bom=ByteOrderMask::NONE; + default_bom=ByteOrderMask::UTF8; + + callback_u8=nullptr; + callback_u16=nullptr; + callback_u32=nullptr; + event_callback=nullptr; + } + template<> void TextInputStream::SetParseCallback(ParseCallback *pc){callback_u8=pc;} template<> void TextInputStream::SetParseCallback(ParseCallback *pc){callback_u16=pc;} template<> void TextInputStream::SetParseCallback(ParseCallback *pc){callback_u32=pc;} @@ -80,7 +100,7 @@ namespace hgl int TextInputStream::TextBlockParse() { - uint8 *p=buffer; + uint8 *p=(uint8 *)buffer; if(stream_pos==0) //最开始,那检测一下BOM头 { @@ -124,11 +144,19 @@ namespace hgl int TextInputStream::Run() { - if(!input_stream)return(-1); - if(!callback_u8 &&!callback_u16 - &&!callback_u32)return(-2); + &&!callback_u32)return(-2); + + if(!input_stream) + { + if(buffer) + { + return TextBlockParse(); + } + + return(-1); + } int64 read_size;