MFEM  v3.4
Finite element discretization library
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Pages
gzstream.hpp
Go to the documentation of this file.
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.h
21 // Revision : $Revision: 1.5 $
22 // Revision_date : $Date: 2002/04/26 23:30:15 $
23 // Author(s) : Deepak Bandyopadhyay, Lutz Kettner
24 //
25 // Standard streambuf implementation following Nicolai Josuttis, "The
26 // Standard C++ Library".
27 // ============================================================================
28 //
29 // GNU LESSER GENERAL PUBLIC LICENSE
30 // Version 2.1, February 1999
31 //
32 // Copyright (C) 1991, 1999 Free Software Foundation, Inc.
33 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
34 // Everyone is permitted to copy and distribute verbatim copies
35 // of this license document, but changing it is not allowed.
36 //
37 // [This is the first released version of the Lesser GPL. It also counts
38 // as the successor of the GNU Library Public License, version 2, hence
39 // the version number 2.1.]
40 //
41 // Preamble
42 //
43 // The licenses for most software are designed to take away your
44 // freedom to share and change it. By contrast, the GNU General Public
45 // Licenses are intended to guarantee your freedom to share and change
46 // free software--to make sure the software is free for all its users.
47 //
48 // This license, the Lesser General Public License, applies to some
49 // specially designated software packages--typically libraries--of the
50 // Free Software Foundation and other authors who decide to use it. You
51 // can use it too, but we suggest you first think carefully about whether
52 // this license or the ordinary General Public License is the better
53 // strategy to use in any particular case, based on the explanations below.
54 //
55 // When we speak of free software, we are referring to freedom of use,
56 // not price. Our General Public Licenses are designed to make sure that
57 // you have the freedom to distribute copies of free software (and charge
58 // for this service if you wish); that you receive source code or can get
59 // it if you want it; that you can change the software and use pieces of
60 // it in new free programs; and that you are informed that you can do
61 // these things.
62 //
63 // To protect your rights, we need to make restrictions that forbid
64 // distributors to deny you these rights or to ask you to surrender these
65 // rights. These restrictions translate to certain responsibilities for
66 // you if you distribute copies of the library or if you modify it.
67 //
68 // For example, if you distribute copies of the library, whether gratis
69 // or for a fee, you must give the recipients all the rights that we gave
70 // you. You must make sure that they, too, receive or can get the source
71 // code. If you link other code with the library, you must provide
72 // complete object files to the recipients, so that they can relink them
73 // with the library after making changes to the library and recompiling
74 // it. And you must show them these terms so they know their rights.
75 //
76 // We protect your rights with a two-step method: (1) we copyright the
77 // library, and (2) we offer you this license, which gives you legal
78 // permission to copy, distribute and/or modify the library.
79 //
80 // To protect each distributor, we want to make it very clear that
81 // there is no warranty for the free library. Also, if the library is
82 // modified by someone else and passed on, the recipients should know
83 // that what they have is not the original version, so that the original
84 // author's reputation will not be affected by problems that might be
85 // introduced by others.
86 //
87 // Finally, software patents pose a constant threat to the existence of
88 // any free program. We wish to make sure that a company cannot
89 // effectively restrict the users of a free program by obtaining a
90 // restrictive license from a patent holder. Therefore, we insist that
91 // any patent license obtained for a version of the library must be
92 // consistent with the full freedom of use specified in this license.
93 //
94 // Most GNU software, including some libraries, is covered by the
95 // ordinary GNU General Public License. This license, the GNU Lesser
96 // General Public License, applies to certain designated libraries, and
97 // is quite different from the ordinary General Public License. We use
98 // this license for certain libraries in order to permit linking those
99 // libraries into non-free programs.
100 //
101 // When a program is linked with a library, whether statically or using
102 // a shared library, the combination of the two is legally speaking a
103 // combined work, a derivative of the original library. The ordinary
104 // General Public License therefore permits such linking only if the
105 // entire combination fits its criteria of freedom. The Lesser General
106 // Public License permits more lax criteria for linking other code with
107 // the library.
108 //
109 // We call this license the "Lesser" General Public License because it
110 // does Less to protect the user's freedom than the ordinary General
111 // Public License. It also provides other free software developers Less
112 // of an advantage over competing non-free programs. These disadvantages
113 // are the reason we use the ordinary General Public License for many
114 // libraries. However, the Lesser license provides advantages in certain
115 // special circumstances.
116 //
117 // For example, on rare occasions, there may be a special need to
118 // encourage the widest possible use of a certain library, so that it becomes
119 // a de-facto standard. To achieve this, non-free programs must be
120 // allowed to use the library. A more frequent case is that a free
121 // library does the same job as widely used non-free libraries. In this
122 // case, there is little to gain by limiting the free library to free
123 // software only, so we use the Lesser General Public License.
124 //
125 // In other cases, permission to use a particular library in non-free
126 // programs enables a greater number of people to use a large body of
127 // free software. For example, permission to use the GNU C Library in
128 // non-free programs enables many more people to use the whole GNU
129 // operating system, as well as its variant, the GNU/Linux operating
130 // system.
131 //
132 // Although the Lesser General Public License is Less protective of the
133 // users' freedom, it does ensure that the user of a program that is
134 // linked with the Library has the freedom and the wherewithal to run
135 // that program using a modified version of the Library.
136 //
137 // The precise terms and conditions for copying, distribution and
138 // modification follow. Pay close attention to the difference between a
139 // "work based on the library" and a "work that uses the library". The
140 // former contains code derived from the library, whereas the latter must
141 // be combined with the library in order to run.
142 //
143 // GNU LESSER GENERAL PUBLIC LICENSE
144 // TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
145 //
146 // 0. This License Agreement applies to any software library or other
147 // program which contains a notice placed by the copyright holder or
148 // other authorized party saying it may be distributed under the terms of
149 // this Lesser General Public License (also called "this License").
150 // Each licensee is addressed as "you".
151 //
152 // A "library" means a collection of software functions and/or data
153 // prepared so as to be conveniently linked with application programs
154 // (which use some of those functions and data) to form executables.
155 //
156 // The "Library", below, refers to any such software library or work
157 // which has been distributed under these terms. A "work based on the
158 // Library" means either the Library or any derivative work under
159 // copyright law: that is to say, a work containing the Library or a
160 // portion of it, either verbatim or with modifications and/or translated
161 // straightforwardly into another language. (Hereinafter, translation is
162 // included without limitation in the term "modification".)
163 //
164 // "Source code" for a work means the preferred form of the work for
165 // making modifications to it. For a library, complete source code means
166 // all the source code for all modules it contains, plus any associated
167 // interface definition files, plus the scripts used to control compilation
168 // and installation of the library.
169 //
170 // Activities other than copying, distribution and modification are not
171 // covered by this License; they are outside its scope. The act of
172 // running a program using the Library is not restricted, and output from
173 // such a program is covered only if its contents constitute a work based
174 // on the Library (independent of the use of the Library in a tool for
175 // writing it). Whether that is true depends on what the Library does
176 // and what the program that uses the Library does.
177 //
178 // 1. You may copy and distribute verbatim copies of the Library's
179 // complete source code as you receive it, in any medium, provided that
180 // you conspicuously and appropriately publish on each copy an
181 // appropriate copyright notice and disclaimer of warranty; keep intact
182 // all the notices that refer to this License and to the absence of any
183 // warranty; and distribute a copy of this License along with the
184 // Library.
185 //
186 // You may charge a fee for the physical act of transferring a copy,
187 // and you may at your option offer warranty protection in exchange for a
188 // fee.
189 //
190 // 2. You may modify your copy or copies of the Library or any portion
191 // of it, thus forming a work based on the Library, and copy and
192 // distribute such modifications or work under the terms of Section 1
193 // above, provided that you also meet all of these conditions:
194 //
195 // a) The modified work must itself be a software library.
196 //
197 // b) You must cause the files modified to carry prominent notices
198 // stating that you changed the files and the date of any change.
199 //
200 // c) You must cause the whole of the work to be licensed at no
201 // charge to all third parties under the terms of this License.
202 //
203 // d) If a facility in the modified Library refers to a function or a
204 // table of data to be supplied by an application program that uses
205 // the facility, other than as an argument passed when the facility
206 // is invoked, then you must make a good faith effort to ensure that,
207 // in the event an application does not supply such function or
208 // table, the facility still operates, and performs whatever part of
209 // its purpose remains meaningful.
210 //
211 // (For example, a function in a library to compute square roots has
212 // a purpose that is entirely well-defined independent of the
213 // application. Therefore, Subsection 2d requires that any
214 // application-supplied function or table used by this function must
215 // be optional: if the application does not supply it, the square
216 // root function must still compute square roots.)
217 //
218 // These requirements apply to the modified work as a whole. If
219 // identifiable sections of that work are not derived from the Library,
220 // and can be reasonably considered independent and separate works in
221 // themselves, then this License, and its terms, do not apply to those
222 // sections when you distribute them as separate works. But when you
223 // distribute the same sections as part of a whole which is a work based
224 // on the Library, the distribution of the whole must be on the terms of
225 // this License, whose permissions for other licensees extend to the
226 // entire whole, and thus to each and every part regardless of who wrote
227 // it.
228 //
229 // Thus, it is not the intent of this section to claim rights or contest
230 // your rights to work written entirely by you; rather, the intent is to
231 // exercise the right to control the distribution of derivative or
232 // collective works based on the Library.
233 //
234 // In addition, mere aggregation of another work not based on the Library
235 // with the Library (or with a work based on the Library) on a volume of
236 // a storage or distribution medium does not bring the other work under
237 // the scope of this License.
238 //
239 // 3. You may opt to apply the terms of the ordinary GNU General Public
240 // License instead of this License to a given copy of the Library. To do
241 // this, you must alter all the notices that refer to this License, so
242 // that they refer to the ordinary GNU General Public License, version 2,
243 // instead of to this License. (If a newer version than version 2 of the
244 // ordinary GNU General Public License has appeared, then you can specify
245 // that version instead if you wish.) Do not make any other change in
246 // these notices.
247 //
248 // Once this change is made in a given copy, it is irreversible for
249 // that copy, so the ordinary GNU General Public License applies to all
250 // subsequent copies and derivative works made from that copy.
251 //
252 // This option is useful when you wish to copy part of the code of
253 // the Library into a program that is not a library.
254 //
255 // 4. You may copy and distribute the Library (or a portion or
256 // derivative of it, under Section 2) in object code or executable form
257 // under the terms of Sections 1 and 2 above provided that you accompany
258 // it with the complete corresponding machine-readable source code, which
259 // must be distributed under the terms of Sections 1 and 2 above on a
260 // medium customarily used for software interchange.
261 //
262 // If distribution of object code is made by offering access to copy
263 // from a designated place, then offering equivalent access to copy the
264 // source code from the same place satisfies the requirement to
265 // distribute the source code, even though third parties are not
266 // compelled to copy the source along with the object code.
267 //
268 // 5. A program that contains no derivative of any portion of the
269 // Library, but is designed to work with the Library by being compiled or
270 // linked with it, is called a "work that uses the Library". Such a
271 // work, in isolation, is not a derivative work of the Library, and
272 // therefore falls outside the scope of this License.
273 //
274 // However, linking a "work that uses the Library" with the Library
275 // creates an executable that is a derivative of the Library (because it
276 // contains portions of the Library), rather than a "work that uses the
277 // library". The executable is therefore covered by this License.
278 // Section 6 states terms for distribution of such executables.
279 //
280 // When a "work that uses the Library" uses material from a header file
281 // that is part of the Library, the object code for the work may be a
282 // derivative work of the Library even though the source code is not.
283 // Whether this is true is especially significant if the work can be
284 // linked without the Library, or if the work is itself a library. The
285 // threshold for this to be true is not precisely defined by law.
286 //
287 // If such an object file uses only numerical parameters, data
288 // structure layouts and accessors, and small macros and small inline
289 // functions (ten lines or less in length), then the use of the object
290 // file is unrestricted, regardless of whether it is legally a derivative
291 // work. (Executables containing this object code plus portions of the
292 // Library will still fall under Section 6.)
293 //
294 // Otherwise, if the work is a derivative of the Library, you may
295 // distribute the object code for the work under the terms of Section 6.
296 // Any executables containing that work also fall under Section 6,
297 // whether or not they are linked directly with the Library itself.
298 //
299 // 6. As an exception to the Sections above, you may also combine or
300 // link a "work that uses the Library" with the Library to produce a
301 // work containing portions of the Library, and distribute that work
302 // under terms of your choice, provided that the terms permit
303 // modification of the work for the customer's own use and reverse
304 // engineering for debugging such modifications.
305 //
306 // You must give prominent notice with each copy of the work that the
307 // Library is used in it and that the Library and its use are covered by
308 // this License. You must supply a copy of this License. If the work
309 // during execution displays copyright notices, you must include the
310 // copyright notice for the Library among them, as well as a reference
311 // directing the user to the copy of this License. Also, you must do one
312 // of these things:
313 //
314 // a) Accompany the work with the complete corresponding
315 // machine-readable source code for the Library including whatever
316 // changes were used in the work (which must be distributed under
317 // Sections 1 and 2 above); and, if the work is an executable linked
318 // with the Library, with the complete machine-readable "work that
319 // uses the Library", as object code and/or source code, so that the
320 // user can modify the Library and then relink to produce a modified
321 // executable containing the modified Library. (It is understood
322 // that the user who changes the contents of definitions files in the
323 // Library will not necessarily be able to recompile the application
324 // to use the modified definitions.)
325 //
326 // b) Use a suitable shared library mechanism for linking with the
327 // Library. A suitable mechanism is one that (1) uses at run time a
328 // copy of the library already present on the user's computer system,
329 // rather than copying library functions into the executable, and (2)
330 // will operate properly with a modified version of the library, if
331 // the user installs one, as long as the modified version is
332 // interface-compatible with the version that the work was made with.
333 //
334 // c) Accompany the work with a written offer, valid for at
335 // least three years, to give the same user the materials
336 // specified in Subsection 6a, above, for a charge no more
337 // than the cost of performing this distribution.
338 //
339 // d) If distribution of the work is made by offering access to copy
340 // from a designated place, offer equivalent access to copy the above
341 // specified materials from the same place.
342 //
343 // e) Verify that the user has already received a copy of these
344 // materials or that you have already sent this user a copy.
345 //
346 // For an executable, the required form of the "work that uses the
347 // Library" must include any data and utility programs needed for
348 // reproducing the executable from it. However, as a special exception,
349 // the materials to be distributed need not include anything that is
350 // normally distributed (in either source or binary form) with the major
351 // components (compiler, kernel, and so on) of the operating system on
352 // which the executable runs, unless that component itself accompanies
353 // the executable.
354 //
355 // It may happen that this requirement contradicts the license
356 // restrictions of other proprietary libraries that do not normally
357 // accompany the operating system. Such a contradiction means you cannot
358 // use both them and the Library together in an executable that you
359 // distribute.
360 //
361 // 7. You may place library facilities that are a work based on the
362 // Library side-by-side in a single library together with other library
363 // facilities not covered by this License, and distribute such a combined
364 // library, provided that the separate distribution of the work based on
365 // the Library and of the other library facilities is otherwise
366 // permitted, and provided that you do these two things:
367 //
368 // a) Accompany the combined library with a copy of the same work
369 // based on the Library, uncombined with any other library
370 // facilities. This must be distributed under the terms of the
371 // Sections above.
372 //
373 // b) Give prominent notice with the combined library of the fact
374 // that part of it is a work based on the Library, and explaining
375 // where to find the accompanying uncombined form of the same work.
376 //
377 // 8. You may not copy, modify, sublicense, link with, or distribute
378 // the Library except as expressly provided under this License. Any
379 // attempt otherwise to copy, modify, sublicense, link with, or
380 // distribute the Library is void, and will automatically terminate your
381 // rights under this License. However, parties who have received copies,
382 // or rights, from you under this License will not have their licenses
383 // terminated so long as such parties remain in full compliance.
384 //
385 // 9. You are not required to accept this License, since you have not
386 // signed it. However, nothing else grants you permission to modify or
387 // distribute the Library or its derivative works. These actions are
388 // prohibited by law if you do not accept this License. Therefore, by
389 // modifying or distributing the Library (or any work based on the
390 // Library), you indicate your acceptance of this License to do so, and
391 // all its terms and conditions for copying, distributing or modifying
392 // the Library or works based on it.
393 //
394 // 10. Each time you redistribute the Library (or any work based on the
395 // Library), the recipient automatically receives a license from the
396 // original licensor to copy, distribute, link with or modify the Library
397 // subject to these terms and conditions. You may not impose any further
398 // restrictions on the recipients' exercise of the rights granted herein.
399 // You are not responsible for enforcing compliance by third parties with
400 // this License.
401 //
402 // 11. If, as a consequence of a court judgment or allegation of patent
403 // infringement or for any other reason (not limited to patent issues),
404 // conditions are imposed on you (whether by court order, agreement or
405 // otherwise) that contradict the conditions of this License, they do not
406 // excuse you from the conditions of this License. If you cannot
407 // distribute so as to satisfy simultaneously your obligations under this
408 // License and any other pertinent obligations, then as a consequence you
409 // may not distribute the Library at all. For example, if a patent
410 // license would not permit royalty-free redistribution of the Library by
411 // all those who receive copies directly or indirectly through you, then
412 // the only way you could satisfy both it and this License would be to
413 // refrain entirely from distribution of the Library.
414 //
415 // If any portion of this section is held invalid or unenforceable under any
416 // particular circumstance, the balance of the section is intended to apply,
417 // and the section as a whole is intended to apply in other circumstances.
418 //
419 // It is not the purpose of this section to induce you to infringe any
420 // patents or other property right claims or to contest validity of any
421 // such claims; this section has the sole purpose of protecting the
422 // integrity of the free software distribution system which is
423 // implemented by public license practices. Many people have made
424 // generous contributions to the wide range of software distributed
425 // through that system in reliance on consistent application of that
426 // system; it is up to the author/donor to decide if he or she is willing
427 // to distribute software through any other system and a licensee cannot
428 // impose that choice.
429 //
430 // This section is intended to make thoroughly clear what is believed to
431 // be a consequence of the rest of this License.
432 //
433 // 12. If the distribution and/or use of the Library is restricted in
434 // certain countries either by patents or by copyrighted interfaces, the
435 // original copyright holder who places the Library under this License may add
436 // an explicit geographical distribution limitation excluding those countries,
437 // so that distribution is permitted only in or among countries not thus
438 // excluded. In such case, this License incorporates the limitation as if
439 // written in the body of this License.
440 //
441 // 13. The Free Software Foundation may publish revised and/or new
442 // versions of the Lesser General Public License from time to time.
443 // Such new versions will be similar in spirit to the present version,
444 // but may differ in detail to address new problems or concerns.
445 //
446 // Each version is given a distinguishing version number. If the Library
447 // specifies a version number of this License which applies to it and
448 // "any later version", you have the option of following the terms and
449 // conditions either of that version or of any later version published by
450 // the Free Software Foundation. If the Library does not specify a
451 // license version number, you may choose any version ever published by
452 // the Free Software Foundation.
453 //
454 // 14. If you wish to incorporate parts of the Library into other free
455 // programs whose distribution conditions are incompatible with these,
456 // write to the author to ask for permission. For software which is
457 // copyrighted by the Free Software Foundation, write to the Free
458 // Software Foundation; we sometimes make exceptions for this. Our
459 // decision will be guided by the two goals of preserving the free status
460 // of all derivatives of our free software and of promoting the sharing
461 // and reuse of software generally.
462 //
463 // NO WARRANTY
464 //
465 // 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
466 // WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
467 // EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
468 // OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
469 // KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
470 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
471 // PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
472 // LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
473 // THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
474 //
475 // 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
476 // WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
477 // AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
478 // FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
479 // CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
480 // LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
481 // RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
482 // FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
483 // SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
484 // DAMAGES.
485 //
486 // END OF TERMS AND CONDITIONS
487 //
488 // How to Apply These Terms to Your New Libraries
489 //
490 // If you develop a new library, and you want it to be of the greatest
491 // possible use to the public, we recommend making it free software that
492 // everyone can redistribute and change. You can do so by permitting
493 // redistribution under these terms (or, alternatively, under the terms of the
494 // ordinary General Public License).
495 //
496 // To apply these terms, attach the following notices to the library. It is
497 // safest to attach them to the start of each source file to most effectively
498 // convey the exclusion of warranty; and each file should have at least the
499 // "copyright" line and a pointer to where the full notice is found.
500 //
501 // <one line to give the library's name and a brief idea of what it does.>
502 // Copyright (C) <year> <name of author>
503 //
504 // This library is free software; you can redistribute it and/or
505 // modify it under the terms of the GNU Lesser General Public
506 // License as published by the Free Software Foundation; either
507 // version 2.1 of the License, or (at your option) any later version.
508 //
509 // This library is distributed in the hope that it will be useful,
510 // but WITHOUT ANY WARRANTY; without even the implied warranty of
511 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
512 // Lesser General Public License for more details.
513 //
514 // You should have received a copy of the GNU Lesser General Public
515 // License along with this library; if not, write to the Free Software
516 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
517 //
518 // Also add information on how to contact you by electronic and paper mail.
519 //
520 // You should also get your employer (if you work as a programmer) or your
521 // school, if any, to sign a "copyright disclaimer" for the library, if
522 // necessary. Here is a sample; alter the names:
523 //
524 // Yoyodyne, Inc., hereby disclaims all copyright interest in the
525 // library `Frob' (a library for tweaking knobs) written by James Random Hacker.
526 //
527 // <signature of Ty Coon>, 1 April 1990
528 // Ty Coon, President of Vice
529 //
530 // That's all there is to it!
531 //
532 // 10Oct16: Mark C. Miller:
533 // * Modified to build in MFEM source tree and use 'mfem' namespace
534 // * Modified to use char *mode for constructors/open instead of int
535 // * Changed bufferSize from 47+256 to 8192 (8 kilobytes)
536 // * Other notes:
537 // * consider mode char options for zlib's internal buffer sizes
538 
539 
540 #ifndef MFEM_GZSTREAM_H
541 #define MFEM_GZSTREAM_H
542 
543 #include "../config/config.hpp"
544 
545 // standard C++ with new header file names and std:: namespace
546 #include <iostream>
547 #ifdef MFEM_USE_GZSTREAM
548 #include <zlib.h>
549 #endif
550 
551 namespace mfem
552 {
553 
554 // ----------------------------------------------------------------------------
555 // Internal classes to implement gzstream. See below for user classes.
556 // ----------------------------------------------------------------------------
557 
558 #ifdef MFEM_USE_GZSTREAM
559 class gzstreambuf : public std::streambuf
560 {
561 private:
562  static const int bufferSize = 8192; // size of data buff
563  // totals 512 bytes under g++ for igzstream at the end.
564 
565  gzFile file; // file handle for compressed file
566  char buffer[bufferSize]; // data buffer
567  char opened; // open/close state of stream
568  char mode[16]; // I/O mode chars
569 
570  int flush_buffer();
571 
572 public:
573  gzstreambuf() : opened(0)
574  {
575  setp( buffer, buffer + (bufferSize-1));
576  setg( buffer + 4, // beginning of putback area
577  buffer + 4, // read position
578  buffer + 4); // end position
579  // ASSERT: both input & output capabilities will not be used together
580  }
581  int is_open() { return opened; }
582  gzstreambuf* open(char const *name, char const *mode);
583  gzstreambuf* close();
585 
586  virtual int overflow( int c = traits_type::eof());
587  virtual int underflow();
588  virtual int sync();
589 };
590 
591 class gzstreambase : virtual public std::ios
592 {
593 protected:
595 
596 public:
597  gzstreambase() { init(&buf); }
598  gzstreambase(char const * name, char const *mode);
599  ~gzstreambase();
600  void open(char const * name, char const *mode);
601  void close();
602  gzstreambuf* rdbuf() { return &buf; }
603 };
604 
605 // ----------------------------------------------------------------------------
606 // User classes. Use igzstream and ogzstream analogously to ifstream and
607 // ofstream respectively. They read and write files based on the gz*
608 // function interface of the zlib. Files are compatible with gzip compression.
609 // ----------------------------------------------------------------------------
610 
611 class igzstream : public gzstreambase, public std::istream
612 {
613 public:
614  igzstream() : std::istream( &buf) {}
615  /** Constructs a gzip compressed input stream object and opens
616  the associated file. The mode chars are as in gzopen(),
617  https://refspecs.linuxbase.org/LSB_3.0.0/LSB-PDA/LSB-PDA/zlib-gzopen-1.html.
618  Default mode is "rb". */
619  igzstream(char const * name, char const *mode = "rb")
620  : gzstreambase(name, mode), std::istream( &buf) {}
622  /** Opens a gzip compressed input stream. The mode chars are as in gzopen(),
623  https://refspecs.linuxbase.org/LSB_3.0.0/LSB-PDA/LSB-PDA/zlib-gzopen-1.html.
624  Default mode is "rb". */
625  void open(char const * name, char const *mode = "rb")
626  {
627  gzstreambase::open(name, mode);
628  }
629 };
630 #endif
631 
632 class ifgzstream : public std::istream
633 {
634 public:
635  /** Simple replacement for class @c std::ifstream that automatically detects
636  compressed files in gzip format and transparently uncompresses them.
637  Internally, the classes @c std::filebuf or @ref gzstreambuf are used to
638  handle the file I/O. Reading compressed files requires the MFEM
639  build-time option MFEM_USE_GZSTREAM.
640  @note For uncompressed files, the @a mode option is ignored and the file
641  is opened with @c std::ios_base::in mode.
642  @see @ref ofgzstream,
643  https://refspecs.linuxbase.org/LSB_3.0.0/LSB-PDA/LSB-PDA/zlib-gzopen-1.html. */
644  ifgzstream(char const *name, char const *mode = "rb");
645  ~ifgzstream() { delete buf; }
646 
647 protected:
648  std::streambuf *buf;
649  static bool maybe_gz(const char *fn);
650 
651 private:
652  ifgzstream(const ifgzstream&); // Prevent object copy
653  ifgzstream& operator=(const ifgzstream&); // Prevent object assignment
654 };
655 
656 #ifdef MFEM_USE_GZSTREAM
657 class ogzstream : public gzstreambase, public std::ostream
658 {
659 public:
660  ogzstream() : std::ostream( &buf) {}
661  /** Constructs a gzip compressed output stream object and opens
662  the associated file. The mode chars are as in gzopen(),
663  https://refspecs.linuxbase.org/LSB_3.0.0/LSB-PDA/LSB-PDA/zlib-gzopen-1.html.
664  Default mode is "wb6". */
665  ogzstream(char const * name, char const *mode = "wb6")
666  : gzstreambase(name, mode), std::ostream( &buf) {}
668  /** Opens a gzip compressed output stream. The mode chars are as in gzopen(),
669  https://refspecs.linuxbase.org/LSB_3.0.0/LSB-PDA/LSB-PDA/zlib-gzopen-1.html.
670  Default mode is "wb6". */
671  void open(char const * name, char const *mode = "wb6")
672  {
673  gzstreambase::open(name, mode);
674  }
675 };
676 #endif
677 
678 class ofgzstream : public std::ostream
679 {
680 public:
681  static char const *default_mode; // defined in gzstream.cpp
682 
683  /** Simple replacement for class @c std::ofstream that can transparently
684  create files compressed in gzip format (when @a mode contains the
685  character @c 'z') or regular uncompressed files. Internally, the classes
686  @c std::filebuf or @ref gzstreambuf are used to handle the file I/O.
687  The mode chars are as in gzopen() with additional caveat that presence of
688  a @c 'z' character indicates desire to compress. Default mode is "zwb6".
689  Writing compressed files requires the MFEM build-time option
690  MFEM_USE_GZSTREAM.
691  @note For uncompressed files, the @a mode option is ignored and the file
692  is opened with @c std::ios_base::out mode.
693  @see @ref ifgzstream,
694  https://refspecs.linuxbase.org/LSB_3.0.0/LSB-PDA/LSB-PDA/zlib-gzopen-1.html. */
695  ofgzstream(char const *name, char const *mode = default_mode);
696 
697  ~ofgzstream() { delete buf; }
698 
699 protected:
700  std::streambuf *buf;
701 
702 private:
703  ofgzstream(const ofgzstream&); // Prevent object copy
704  ofgzstream& operator=(const ofgzstream&); // Prevent object assignment
705 };
706 
707 } // namespace mfem
708 
709 #endif // MFEM_GZSTREAM_H
gzstreambuf buf
Definition: gzstream.hpp:594
gzstreambuf * close()
Definition: gzstream.cpp:62
std::streambuf * buf
Definition: gzstream.hpp:700
virtual int overflow(int c=traits_type::eof())
Definition: gzstream.cpp:123
static bool maybe_gz(const char *fn)
Definition: gzstream.cpp:193
static char const * default_mode
Definition: gzstream.hpp:681
gzstreambuf * rdbuf()
Definition: gzstream.hpp:667
ogzstream(char const *name, char const *mode="wb6")
Definition: gzstream.hpp:665
igzstream(char const *name, char const *mode="rb")
Definition: gzstream.hpp:619
ifgzstream(char const *name, char const *mode="rb")
Definition: gzstream.cpp:202
gzstreambuf * rdbuf()
Definition: gzstream.hpp:602
ofgzstream(char const *name, char const *mode=default_mode)
Definition: gzstream.cpp:240
void open(char const *name, char const *mode="wb6")
Definition: gzstream.hpp:671
gzstreambuf * rdbuf()
Definition: gzstream.hpp:621
std::streambuf * buf
Definition: gzstream.hpp:648
void open(char const *name, char const *mode="rb")
Definition: gzstream.hpp:625
virtual int underflow()
Definition: gzstream.cpp:76
virtual int sync()
Definition: gzstream.cpp:142
gzstreambuf * open(char const *name, char const *mode)
Definition: gzstream.cpp:46
void open(char const *name, char const *mode)
Definition: gzstream.cpp:172