diff options
author | redpony <redpony@1f5c12ca-751b-0410-a591-d2e778427230> | 2006-08-20 00:16:08 +0400 |
---|---|---|
committer | redpony <redpony@1f5c12ca-751b-0410-a591-d2e778427230> | 2006-08-20 00:16:08 +0400 |
commit | 960db0525c318e3f8547ed5c44115a930bcec43f (patch) | |
tree | 05d40b7536a8a1f0edd9da7c9b02552a2f9f487c /moses | |
parent | 3fb417f914bb575f5df66dde96f18bd280d861a9 (diff) |
streambuf for gzipped files.
git-svn-id: https://mosesdecoder.svn.sourceforge.net/svnroot/mosesdecoder/trunk@778 1f5c12ca-751b-0410-a591-d2e778427230
Diffstat (limited to 'moses')
-rw-r--r-- | moses/src/gzfilebuf.h | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/moses/src/gzfilebuf.h b/moses/src/gzfilebuf.h new file mode 100644 index 000000000..5e0b38c6a --- /dev/null +++ b/moses/src/gzfilebuf.h @@ -0,0 +1,80 @@ +#ifndef _GZFILEBUF_H_ +#define _GZFILEBUF_H_ + +#include <streambuf> +#include <zlib.h> + +class gzfilebuf : public std::streambuf { +public: + gzfilebuf(const char *filename) + { _gzf = gzopen(filename, "rb"); + setg (_buff+sizeof(int), // beginning of putback area + _buff+sizeof(int), // read position + _buff+sizeof(int)); // end position + } + ~gzfilebuf() { gzclose(_gzf); } +protected: + virtual int_type overflow (int_type c) { + throw; + } + + // write multiple characters + virtual + std::streamsize xsputn (const char* s, + std::streamsize num) { + throw; + } + + virtual std::streampos seekpos ( std::streampos sp, std::ios_base::openmode which = std::ios_base::in | std::ios_base::out ){ throw; + } + + //read one character + virtual int_type underflow () { + // is read position before end of _buff? + if (gptr() < egptr()) { + return traits_type::to_int_type(*gptr()); + } + + /* process size of putback area + * - use number of characters read + * - but at most four + */ + unsigned int numPutback = gptr() - eback(); + if (numPutback > sizeof(int)) { + numPutback = sizeof(int); + } + + /* copy up to four characters previously read into + * the putback _buff (area of first four characters) + */ + std::memmove (_buff+(sizeof(int)-numPutback), gptr()-numPutback, + numPutback); + + // read new characters + int num = gzread(_gzf, _buff+sizeof(int), _buffsize-sizeof(int)); + if (num <= 0) { + // ERROR or EOF + return EOF; + } + + // reset _buff pointers + setg (_buff+(sizeof(int)-numPutback), // beginning of putback area + _buff+sizeof(int), // read position + _buff+sizeof(int)+num); // end of buffer + + // return next character + return traits_type::to_int_type(*gptr()); + } + + std::streamsize xsgetn (char* s, + std::streamsize num) { + return gzread(_gzf,s,num); + } + +private: + gzFile _gzf; + static const unsigned int _buffsize = 1024; + char _buff[_buffsize]; +}; + +#endif |