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