1/* -*-C++-*- 2 * This library is free software; you can redistribute it and/or 3 * modify it under the terms of the GNU Lesser General Public 4 * License as published by the Free Software Foundation; either 5 * version 2.1 of the License, or (at your option) any later version. 6 * 7 * This library is distributed in the hope that it will be useful, 8 * but WITHOUT ANY WARRANTY; without even the implied warranty of 9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 10 * Lesser General Public License for more details. 11 * 12 * You should have received a copy of the GNU Lesser General Public 13 * License along with this library; if not, write to the Free Software 14 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 15 * 16 * binio.h - Binary stream I/O classes 17 * Copyright (C) 2002, 2003, 2005 Simon Peter <dn.tlp@gmx.net> 18 */ 19 20#ifndef H_BINIO_BINIO 21#define H_BINIO_BINIO 22 23/***** Configuration *****/ 24 25// BINIO_ENABLE_STRING - Build std::string supporting methods 26// 27// Set to 1 to build std::string supporting methods. You need the STL to 28// do this. 29#define BINIO_ENABLE_STRING @ENABLE_STRING@ 30 31// BINIO_ENABLE_IOSTREAM - Build iostream wrapper classes 32// 33// Set to 1 to build the iostream wrapper classes. You need the standard 34// C++ library to do this. 35#define BINIO_ENABLE_IOSTREAM @ENABLE_IOSTREAM@ 36 37// BINIO_ISO_STDLIB - Build with ISO C++ standard library compliance 38// 39// Set to 1 to build for the ISO standard C++ library (i.e. namespaces, STL and 40// templatized iostream). Set to 0 to build for the traditional C++ library. 41#define BINIO_ISO_STDLIB @ISO_STDLIB@ 42 43// BINIO_WITH_MATH - Build with 'math.h' dependency to allow float conversions 44// 45// Set to 1 to also build routines that depend on the 'math.h' standard C header 46// file (this sometimes also implies a 'libm' or 'libmath' dependency). These 47// routines are needed in order to write IEEE-754 floating-point numbers on a 48// system that doesn't support this format natively. For only reading these 49// numbers, however, these routines are not needed. If set to 0, writing 50// IEEE-754 numbers on an incompatible system will be disabled. 51#define BINIO_WITH_MATH @WITH_MATH@ 52 53/***** Implementation *****/ 54 55// Disable annoying multiple inheritance compiler warning on MSVC6 56#ifdef _MSC_VER 57# pragma warning(disable: 4250) 58#endif 59 60#if BINIO_ENABLE_STRING 61#include <string> 62#endif 63 64class binio 65{ 66public: 67 typedef enum { 68 BigEndian = 1 << 0, 69 FloatIEEE = 1 << 1 70 } Flag; 71 72 typedef enum { 73 NoError = 0, 74 Fatal = 1 << 0, 75 Unsupported = 1 << 1, 76 NotOpen = 1 << 2, 77 Denied = 1 << 3, 78 NotFound = 1 << 4, 79 Eof = 1 << 5 80 } ErrorCode; 81 82 typedef enum { Set, Add, End } Offset; 83 typedef enum { Single, Double } FType; 84 typedef int Error; 85 86 binio(); 87 virtual ~binio(); 88 89 void setFlag(Flag f, bool set = true); 90 bool getFlag(Flag f); 91 92 Error error(); 93 bool eof(); 94 95 virtual void seek(long, Offset = Set) = 0; 96 virtual long pos() = 0; 97 98protected: 99 typedef @TYPE_INT@ Int; 100 typedef @TYPE_FLOAT@ Float; 101 typedef unsigned char Byte; // has to be unsigned! 102 103 typedef int Flags; 104 105 Flags my_flags; 106 static const Flags system_flags; 107 Error err; 108 109 // Some math.h emulation functions... 110#if !BINIO_WITH_MATH 111 Float pow(Float base, signed int exp); 112 Float ldexp(Float x, signed int exp) { return x * pow(2, exp); } 113#endif 114 115private: 116 static const Flags detect_system_flags(); 117}; 118 119class binistream: virtual public binio 120{ 121public: 122 binistream(); 123 virtual ~binistream(); 124 125 Int readInt(unsigned int size); 126 Float readFloat(FType ft); 127 unsigned long readString(char *str, unsigned long maxlen); 128 unsigned long readString(char *str, unsigned long maxlen, const char delim); 129#if BINIO_ENABLE_STRING 130 std::string readString(const char delim = '\0'); 131#endif 132 133 Int peekInt(unsigned int size); 134 Float peekFloat(FType ft); 135 136 bool ateof(); 137 void ignore(unsigned long amount = 1); 138 139protected: 140 virtual Byte getByte() = 0; 141 142private: 143 Float ieee_single2float(Byte *data); 144 Float ieee_double2float(Byte *data); 145}; 146 147class binostream: virtual public binio 148{ 149public: 150 binostream(); 151 virtual ~binostream(); 152 153 void writeInt(Int val, unsigned int size); 154 void writeFloat(Float f, FType ft); 155 unsigned long writeString(const char *str, unsigned long amount = 0); 156#if BINIO_ENABLE_STRING 157 unsigned long writeString(const std::string &str); 158#endif 159 160protected: 161 virtual void putByte(Byte) = 0; 162 163private: 164 void float2ieee_single(Float f, Byte *data); 165 void float2ieee_double(Float f, Byte *data); 166}; 167 168class binstream: public binistream, public binostream 169{ 170public: 171 binstream(); 172 virtual ~binstream(); 173}; 174 175#endif 176