19e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
29e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *
39e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Copyright (c) 1997
49e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Christian Michelsen Research AS
59e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Advanced Computing
69e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Fantoftvegen 38, 5036 BERGEN, Norway
79e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * http://www.cmr.no
89e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *
99e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Permission to use, copy, modify, distribute and sell this software
109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * and its documentation for any purpose is hereby granted without fee,
119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * provided that the above copyright notice appear in all copies and
129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * that both that copyright notice and this permission notice appear
139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * in supporting documentation.  Christian Michelsen Research AS makes no
149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * representations about the suitability of this software for any
159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * purpose.  It is provided "as is" without express or implied warranty.
169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *
179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef ZSTREAM__H
209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define ZSTREAM__H
219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * zstream.h - C++ interface to the 'zlib' general purpose compression library
249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * $Id: zstream.h 1.1 1997-06-25 12:00:56+02 tyge Exp tyge $
259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include <strstream.h>
289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include <string.h>
299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include <stdio.h>
309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include "zlib.h"
319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#if defined(_WIN32)
339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#   include <fcntl.h>
349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#   include <io.h>
359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#   define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#else
379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#   define SET_BINARY_MODE(file)
389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif
399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectclass zstringlen {
419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectpublic:
429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    zstringlen(class izstream&);
439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    zstringlen(class ozstream&, const char*);
449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    size_t value() const { return val.word; }
459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprivate:
469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    struct Val { unsigned char byte; size_t word; } val;
479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project};
489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project//  ----------------------------- izstream -----------------------------
509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectclass izstream
529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    public:
549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        izstream() : m_fp(0) {}
559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        izstream(FILE* fp) : m_fp(0) { open(fp); }
569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        izstream(const char* name) : m_fp(0) { open(name); }
579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        ~izstream() { close(); }
589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /* Opens a gzip (.gz) file for reading.
609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * open() can be used to read a file which is not in gzip format;
619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * in this case read() will directly read from the file without
629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * decompression. errno can be checked to distinguish two error
639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * cases (if errno is zero, the zlib error is Z_MEM_ERROR).
649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         */
659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        void open(const char* name) {
669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            if (m_fp) close();
679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            m_fp = ::gzopen(name, "rb");
689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        void open(FILE* fp) {
719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            SET_BINARY_MODE(fp);
729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            if (m_fp) close();
739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            m_fp = ::gzdopen(fileno(fp), "rb");
749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /* Flushes all pending input if necessary, closes the compressed file
779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * and deallocates all the (de)compression state. The return value is
789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * the zlib error number (see function error() below).
799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         */
809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        int close() {
819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            int r = ::gzclose(m_fp);
829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            m_fp = 0; return r;
839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /* Binary read the given number of bytes from the compressed file.
869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         */
879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        int read(void* buf, size_t len) {
889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            return ::gzread(m_fp, buf, len);
899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /* Returns the error message for the last error which occurred on the
929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * given compressed file. errnum is set to zlib error number. If an
939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * error occurred in the file system and not in the compression library,
949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * errnum is set to Z_ERRNO and the application may consult errno
959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * to get the exact error code.
969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         */
979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        const char* error(int* errnum) {
989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            return ::gzerror(m_fp, errnum);
999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
1009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        gzFile fp() { return m_fp; }
1029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private:
1049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        gzFile m_fp;
1059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project};
1069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
1089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Binary read the given (array of) object(s) from the compressed file.
1099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * If the input file was not in gzip format, read() copies the objects number
1109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * of bytes into the buffer.
1119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * returns the number of uncompressed bytes actually read
1129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * (0 for end of file, -1 for error).
1139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
1149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projecttemplate <class T, class Items>
1159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectinline int read(izstream& zs, T* x, Items items) {
1169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return ::gzread(zs.fp(), x, items*sizeof(T));
1179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
1189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
1209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Binary input with the '>' operator.
1219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
1229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projecttemplate <class T>
1239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectinline izstream& operator>(izstream& zs, T& x) {
1249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ::gzread(zs.fp(), &x, sizeof(T));
1259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return zs;
1269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
1279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectinline zstringlen::zstringlen(izstream& zs) {
1309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    zs > val.byte;
1319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (val.byte == 255) zs > val.word;
1329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    else val.word = val.byte;
1339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
1349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
1369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Read length of string + the string with the '>' operator.
1379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
1389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectinline izstream& operator>(izstream& zs, char* x) {
1399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    zstringlen len(zs);
1409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ::gzread(zs.fp(), x, len.value());
1419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    x[len.value()] = '\0';
1429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return zs;
1439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
1449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectinline char* read_string(izstream& zs) {
1469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    zstringlen len(zs);
1479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    char* x = new char[len.value()+1];
1489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ::gzread(zs.fp(), x, len.value());
1499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    x[len.value()] = '\0';
1509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return x;
1519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
1529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project// ----------------------------- ozstream -----------------------------
1549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectclass ozstream
1569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
1579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    public:
1589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        ozstream() : m_fp(0), m_os(0) {
1599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
1609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        ozstream(FILE* fp, int level = Z_DEFAULT_COMPRESSION)
1619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            : m_fp(0), m_os(0) {
1629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            open(fp, level);
1639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
1649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        ozstream(const char* name, int level = Z_DEFAULT_COMPRESSION)
1659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            : m_fp(0), m_os(0) {
1669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            open(name, level);
1679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
1689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        ~ozstream() {
1699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            close();
1709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
1719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /* Opens a gzip (.gz) file for writing.
1739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * The compression level parameter should be in 0..9
1749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * errno can be checked to distinguish two error cases
1759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * (if errno is zero, the zlib error is Z_MEM_ERROR).
1769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         */
1779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        void open(const char* name, int level = Z_DEFAULT_COMPRESSION) {
1789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            char mode[4] = "wb\0";
1799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            if (level != Z_DEFAULT_COMPRESSION) mode[2] = '0'+level;
1809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            if (m_fp) close();
1819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            m_fp = ::gzopen(name, mode);
1829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
1839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /* open from a FILE pointer.
1859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         */
1869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        void open(FILE* fp, int level = Z_DEFAULT_COMPRESSION) {
1879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            SET_BINARY_MODE(fp);
1889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            char mode[4] = "wb\0";
1899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            if (level != Z_DEFAULT_COMPRESSION) mode[2] = '0'+level;
1909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            if (m_fp) close();
1919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            m_fp = ::gzdopen(fileno(fp), mode);
1929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
1939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /* Flushes all pending output if necessary, closes the compressed file
1959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * and deallocates all the (de)compression state. The return value is
1969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * the zlib error number (see function error() below).
1979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         */
1989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        int close() {
1999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            if (m_os) {
2009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                ::gzwrite(m_fp, m_os->str(), m_os->pcount());
2019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                delete[] m_os->str(); delete m_os; m_os = 0;
2029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            }
2039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            int r = ::gzclose(m_fp); m_fp = 0; return r;
2049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
2059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /* Binary write the given number of bytes into the compressed file.
2079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         */
2089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        int write(const void* buf, size_t len) {
2099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            return ::gzwrite(m_fp, (voidp) buf, len);
2109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
2119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /* Flushes all pending output into the compressed file. The parameter
2139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * _flush is as in the deflate() function. The return value is the zlib
2149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * error number (see function gzerror below). flush() returns Z_OK if
2159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * the flush_ parameter is Z_FINISH and all output could be flushed.
2169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * flush() should be called only when strictly necessary because it can
2179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * degrade compression.
2189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         */
2199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        int flush(int _flush) {
2209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            os_flush();
2219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            return ::gzflush(m_fp, _flush);
2229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
2239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /* Returns the error message for the last error which occurred on the
2259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * given compressed file. errnum is set to zlib error number. If an
2269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * error occurred in the file system and not in the compression library,
2279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * errnum is set to Z_ERRNO and the application may consult errno
2289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         * to get the exact error code.
2299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         */
2309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        const char* error(int* errnum) {
2319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            return ::gzerror(m_fp, errnum);
2329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
2339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        gzFile fp() { return m_fp; }
2359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        ostream& os() {
2379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            if (m_os == 0) m_os = new ostrstream;
2389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            return *m_os;
2399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
2409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        void os_flush() {
2429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            if (m_os && m_os->pcount()>0) {
2439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                ostrstream* oss = new ostrstream;
2449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                oss->fill(m_os->fill());
2459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                oss->flags(m_os->flags());
2469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                oss->precision(m_os->precision());
2479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                oss->width(m_os->width());
2489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                ::gzwrite(m_fp, m_os->str(), m_os->pcount());
2499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                delete[] m_os->str(); delete m_os; m_os = oss;
2509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            }
2519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
2529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private:
2549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        gzFile m_fp;
2559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        ostrstream* m_os;
2569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project};
2579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
2599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Binary write the given (array of) object(s) into the compressed file.
2609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * returns the number of uncompressed bytes actually written
2619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * (0 in case of error).
2629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
2639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projecttemplate <class T, class Items>
2649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectinline int write(ozstream& zs, const T* x, Items items) {
2659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return ::gzwrite(zs.fp(), (voidp) x, items*sizeof(T));
2669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
2679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
2699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Binary output with the '<' operator.
2709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
2719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projecttemplate <class T>
2729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectinline ozstream& operator<(ozstream& zs, const T& x) {
2739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ::gzwrite(zs.fp(), (voidp) &x, sizeof(T));
2749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return zs;
2759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
2769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectinline zstringlen::zstringlen(ozstream& zs, const char* x) {
2789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    val.byte = 255;  val.word = ::strlen(x);
2799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (val.word < 255) zs < (val.byte = val.word);
2809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    else zs < val;
2819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
2829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
2849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Write length of string + the string with the '<' operator.
2859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
2869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectinline ozstream& operator<(ozstream& zs, const char* x) {
2879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    zstringlen len(zs, x);
2889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ::gzwrite(zs.fp(), (voidp) x, len.value());
2899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return zs;
2909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
2919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef _MSC_VER
2939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectinline ozstream& operator<(ozstream& zs, char* const& x) {
2949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return zs < (const char*) x;
2959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
2969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif
2979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
2999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Ascii write with the << operator;
3009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
3019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projecttemplate <class T>
3029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectinline ostream& operator<<(ozstream& zs, const T& x) {
3039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    zs.os_flush();
3049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return zs.os() << x;
3059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
3069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif
308