From 8f486613be58ced269db1d437e560c16558604e8 Mon Sep 17 00:00:00 2001 From: becquet Date: Thu, 10 May 2007 18:49:20 +0000 Subject: Création de chuck, le programme du robot 2007. --- i/chuck/src/data/data_input_zlib.cc | 84 +++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 i/chuck/src/data/data_input_zlib.cc (limited to 'i/chuck/src/data/data_input_zlib.cc') diff --git a/i/chuck/src/data/data_input_zlib.cc b/i/chuck/src/data/data_input_zlib.cc new file mode 100644 index 0000000..f8f5322 --- /dev/null +++ b/i/chuck/src/data/data_input_zlib.cc @@ -0,0 +1,84 @@ +// data_input_zlib.cc +// robert - programme du robot 2005. {{{ +// +// Copyright (C) 2005 Nicolas Schodet +// +// Robot APB Team/Efrei 2005. +// Web: http://assos.efrei.fr/robot/ +// Email: robot AT efrei DOT fr +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// }}} +#include "data_input_zlib.hh" + +#include + +/// Constructeur. +DataInputZlib::DataInputZlib (DataInput &data) + : data_ (data), inBuf_ (0) +{ + // Allocate input buffer. + inBuf_ = new uint8_t[inBufSize_]; + // Initialise the zlib structure. + zStream_.next_in = 0; + zStream_.avail_in = 0; + zStream_.next_out = 0; + zStream_.avail_out = 0; + zStream_.zalloc = 0; + zStream_.zfree = 0; + zStream_.opaque = 0; + if (inflateInit2 (&zStream_, 32 + 15) != Z_OK) + { + delete[] inBuf_; + throw std::runtime_error (zStream_.msg); + } +} + +/// Destructeur. +DataInputZlib::~DataInputZlib (void) +{ + inflateEnd (&zStream_); + delete[] inBuf_; +} + +/// Lit des données. Même convention que le read de la libc, mais lance +/// une exception en cas d'erreur. +unsigned +DataInputZlib::read (uint8_t *buf, unsigned size) +{ + // Set output buffer. + zStream_.next_out = buf; + zStream_.avail_out = size; + // While not satisfied. + while (zStream_.avail_out) + { + // Feed more data. + if (zStream_.avail_in == 0) + { + zStream_.next_in = inBuf_; + zStream_.avail_in = data_.read (inBuf_, inBufSize_); + } + // Uncompress. + int r = inflate (&zStream_, Z_SYNC_FLUSH); + // Check result. + if (r == Z_STREAM_END) + return size - zStream_.avail_out; + else if (r != Z_OK) + throw std::runtime_error (zStream_.msg); + } + return size; +} + -- cgit v1.2.3