Mercurial > repos > aaronquinlan > multi_intersect
comparison BEDTools-Version-2.14.3/src/utils/gzstream/gzstream.C @ 0:dfcd8b6c1bda
Uploaded
author | aaronquinlan |
---|---|
date | Thu, 03 Nov 2011 10:25:04 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:dfcd8b6c1bda |
---|---|
1 // ============================================================================ | |
2 // gzstream, C++ iostream classes wrapping the zlib compression library. | |
3 // Copyright (C) 2001 Deepak Bandyopadhyay, Lutz Kettner | |
4 // | |
5 // This library is free software; you can redistribute it and/or | |
6 // modify it under the terms of the GNU Lesser General Public | |
7 // License as published by the Free Software Foundation; either | |
8 // version 2.1 of the License, or (at your option) any later version. | |
9 // | |
10 // This library is distributed in the hope that it will be useful, | |
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 // Lesser General Public License for more details. | |
14 // | |
15 // You should have received a copy of the GNU Lesser General Public | |
16 // License along with this library; if not, write to the Free Software | |
17 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 // ============================================================================ | |
19 // | |
20 // File : gzstream.C | |
21 // Revision : $Revision: 1.7 $ | |
22 // Revision_date : $Date: 2003/01/08 14:41:27 $ | |
23 // Author(s) : Deepak Bandyopadhyay, Lutz Kettner | |
24 // | |
25 // Standard streambuf implementation following Nicolai Josuttis, "The | |
26 // Standard C++ Library". | |
27 // ============================================================================ | |
28 | |
29 #include <gzstream.h> | |
30 #include <iostream> | |
31 #include <string.h> // for memcpy | |
32 | |
33 #ifdef GZSTREAM_NAMESPACE | |
34 namespace GZSTREAM_NAMESPACE { | |
35 #endif | |
36 | |
37 // ---------------------------------------------------------------------------- | |
38 // Internal classes to implement gzstream. See header file for user classes. | |
39 // ---------------------------------------------------------------------------- | |
40 | |
41 // -------------------------------------- | |
42 // class gzstreambuf: | |
43 // -------------------------------------- | |
44 | |
45 gzstreambuf* gzstreambuf::open( const char* name, int open_mode) { | |
46 if ( is_open()) | |
47 return (gzstreambuf*)0; | |
48 mode = open_mode; | |
49 // no append nor read/write mode | |
50 if ((mode & std::ios::ate) || (mode & std::ios::app) | |
51 || ((mode & std::ios::in) && (mode & std::ios::out))) | |
52 return (gzstreambuf*)0; | |
53 char fmode[10]; | |
54 char* fmodeptr = fmode; | |
55 if ( mode & std::ios::in) | |
56 *fmodeptr++ = 'r'; | |
57 else if ( mode & std::ios::out) | |
58 *fmodeptr++ = 'w'; | |
59 *fmodeptr++ = 'b'; | |
60 *fmodeptr = '\0'; | |
61 file = gzopen( name, fmode); | |
62 if (file == 0) | |
63 return (gzstreambuf*)0; | |
64 opened = 1; | |
65 return this; | |
66 } | |
67 | |
68 gzstreambuf * gzstreambuf::close() { | |
69 if ( is_open()) { | |
70 sync(); | |
71 opened = 0; | |
72 if ( gzclose( file) == Z_OK) | |
73 return this; | |
74 } | |
75 return (gzstreambuf*)0; | |
76 } | |
77 | |
78 int gzstreambuf::underflow() { // used for input buffer only | |
79 if ( gptr() && ( gptr() < egptr())) | |
80 return * reinterpret_cast<unsigned char *>( gptr()); | |
81 | |
82 if ( ! (mode & std::ios::in) || ! opened) | |
83 return EOF; | |
84 // Josuttis' implementation of inbuf | |
85 int n_putback = gptr() - eback(); | |
86 if ( n_putback > 4) | |
87 n_putback = 4; | |
88 memcpy( buffer + (4 - n_putback), gptr() - n_putback, n_putback); | |
89 | |
90 int num = gzread( file, buffer+4, bufferSize-4); | |
91 if (num <= 0) // ERROR or EOF | |
92 return EOF; | |
93 | |
94 // reset buffer pointers | |
95 setg( buffer + (4 - n_putback), // beginning of putback area | |
96 buffer + 4, // read position | |
97 buffer + 4 + num); // end of buffer | |
98 | |
99 // return next character | |
100 return * reinterpret_cast<unsigned char *>( gptr()); | |
101 } | |
102 | |
103 int gzstreambuf::flush_buffer() { | |
104 // Separate the writing of the buffer from overflow() and | |
105 // sync() operation. | |
106 int w = pptr() - pbase(); | |
107 if ( gzwrite( file, pbase(), w) != w) | |
108 return EOF; | |
109 pbump( -w); | |
110 return w; | |
111 } | |
112 | |
113 int gzstreambuf::overflow( int c) { // used for output buffer only | |
114 if ( ! ( mode & std::ios::out) || ! opened) | |
115 return EOF; | |
116 if (c != EOF) { | |
117 *pptr() = c; | |
118 pbump(1); | |
119 } | |
120 if ( flush_buffer() == EOF) | |
121 return EOF; | |
122 return c; | |
123 } | |
124 | |
125 int gzstreambuf::sync() { | |
126 // Changed to use flush_buffer() instead of overflow( EOF) | |
127 // which caused improper behavior with std::endl and flush(), | |
128 // bug reported by Vincent Ricard. | |
129 if ( pptr() && pptr() > pbase()) { | |
130 if ( flush_buffer() == EOF) | |
131 return -1; | |
132 } | |
133 return 0; | |
134 } | |
135 | |
136 // -------------------------------------- | |
137 // class gzstreambase: | |
138 // -------------------------------------- | |
139 | |
140 gzstreambase::gzstreambase( const char* name, int mode) { | |
141 init( &buf); | |
142 open( name, mode); | |
143 } | |
144 | |
145 gzstreambase::~gzstreambase() { | |
146 buf.close(); | |
147 } | |
148 | |
149 void gzstreambase::open( const char* name, int open_mode) { | |
150 if ( ! buf.open( name, open_mode)) | |
151 clear( rdstate() | std::ios::badbit); | |
152 } | |
153 | |
154 void gzstreambase::close() { | |
155 if ( buf.is_open()) | |
156 if ( ! buf.close()) | |
157 clear( rdstate() | std::ios::badbit); | |
158 } | |
159 | |
160 #ifdef GZSTREAM_NAMESPACE | |
161 } // namespace GZSTREAM_NAMESPACE | |
162 #endif | |
163 | |
164 // ============================================================================ | |
165 // EOF // |