gzstream.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "PreCompiled.h"
00029
00030 #include "gzstream.h"
00031 #include <assert.h>
00032 #include <string>
00033 #include <cstring>
00034
00035
00036 namespace Base {
00037
00038
00039
00040
00041
00042
00043 const int gzstreambuf::bufferSize = BUFFERSIZE;
00044
00045
00046
00047
00048
00049 gzstreambuf* gzstreambuf::open( const char* name, int open_mode, int comp)
00050 {
00051 if ( is_open())
00052 return (gzstreambuf*)0;
00053 mode = open_mode;
00054
00055 if ((mode & std::ios::ate) || (mode & std::ios::app)
00056 || ((mode & std::ios::in) && (mode & std::ios::out)))
00057 return (gzstreambuf*)0;
00058 char fmode[10];
00059 char* fmodeptr = fmode;
00060 if ( mode & std::ios::in)
00061 *fmodeptr++ = 'r';
00062 else if ( mode & std::ios::out) {
00063 assert( comp >= 1 && comp <= 9);
00064 *fmodeptr++ = 'w';
00065 *fmodeptr++ = '1' + comp - 1 ;
00066 }
00067 *fmodeptr++ = 'b';
00068 *fmodeptr = '\0';
00069 file = gzopen( name, fmode);
00070 if (file == 0)
00071 return (gzstreambuf*)0;
00072 opened = 1;
00073 return this;
00074 }
00075
00076 gzstreambuf * gzstreambuf::close() {
00077 if ( is_open()) {
00078 sync();
00079 opened = 0;
00080 if ( gzclose( file) == Z_OK)
00081 return this;
00082 }
00083 return (gzstreambuf*)0;
00084 }
00085
00086 int gzstreambuf::underflow() {
00087 if ( gptr() && ( gptr() < egptr()))
00088 return * reinterpret_cast<unsigned char *>( gptr());
00089
00090 if ( ! (mode & std::ios::in) || ! opened)
00091 return EOF;
00092
00093 int n_putback = gptr() - eback();
00094 if ( n_putback > 4)
00095 n_putback = 4;
00096 memcpy( buffer + (4 - n_putback), gptr() - n_putback, n_putback);
00097
00098 int num = gzread( file, buffer+4, bufferSize-4);
00099 if (num <= 0)
00100 return EOF;
00101
00102
00103 setg( buffer + (4 - n_putback),
00104 buffer + 4,
00105 buffer + 4 + num);
00106
00107
00108 return * reinterpret_cast<unsigned char *>( gptr());
00109 }
00110
00111 int gzstreambuf::flush_buffer() {
00112
00113
00114 int w = pptr() - pbase();
00115 if ( gzwrite( file, pbase(), w) != w)
00116 return EOF;
00117 pbump( -w);
00118 return w;
00119 }
00120
00121 int gzstreambuf::overflow( int c) {
00122 if ( ! ( mode & std::ios::out) || ! opened)
00123 return EOF;
00124 if (c != EOF) {
00125 *pptr() = c;
00126 pbump(1);
00127 }
00128 if ( flush_buffer() == EOF)
00129 return EOF;
00130 return c;
00131 }
00132
00133 int gzstreambuf::sync() {
00134
00135
00136
00137 if ( pptr() && pptr() > pbase()) {
00138 if ( flush_buffer() == EOF)
00139 return -1;
00140 }
00141 return 0;
00142 }
00143
00144
00145
00146
00147
00148 gzstreambase::gzstreambase( const char* name, int mode,int comp) {
00149 init( &buf);
00150 open( name, mode, comp);
00151 }
00152
00153 gzstreambase::~gzstreambase() {
00154 buf.close();
00155 }
00156
00157 void gzstreambase::open( const char* name, int open_mode, int comp) {
00158 if ( ! buf.open( name, open_mode, comp))
00159 clear( rdstate() | std::ios::badbit);
00160 }
00161
00162 void gzstreambase::close() {
00163 if ( buf.is_open())
00164 if ( ! buf.close())
00165 clear( rdstate() | std::ios::badbit);
00166 }
00167
00168
00169 }
00170
00171
00172