From 31930051d59cc2f4fd119e9dcc21747e1bb50a9a Mon Sep 17 00:00:00 2001 From: fgenesis Date: Sun, 23 Sep 2012 05:30:47 +0200 Subject: [PATCH] More compile fixes for gcc 2.95 --- Aquaria/ScriptInterface.cpp | 2 + BBGE/Base.cpp | 2 +- BBGE/Vector.h | 61 +++++++++++++-------------- ExternalLibs/ByteBuffer.h | 84 +++++++++++++++++++++++++++---------- ExternalLibs/FileAPI.cpp | 2 +- 5 files changed, 96 insertions(+), 55 deletions(-) diff --git a/Aquaria/ScriptInterface.cpp b/Aquaria/ScriptInterface.cpp index da05ce7..303e3af 100644 --- a/Aquaria/ScriptInterface.cpp +++ b/Aquaria/ScriptInterface.cpp @@ -359,6 +359,7 @@ static void scriptError(lua_State *L, const std::string& msg) // memory location, be sure this is the case before running into undefined behavior later. // - The C++ standard allows offsetof() only on POD-types. Oh well, it probably works anyways. // If it does not compile for some reason, comment it out, hope for the best, and go ahead. +#if !(defined(__GNUC__) && __GNUC__ <= 2) void compile_time_assertions() { #define oo(cls) offsetof(cls, _objtype) @@ -377,6 +378,7 @@ void compile_time_assertions() compile_assert(oo(Path) == oo(BaseText)); #undef oo } +#endif template static void ensureType(lua_State *L, T *& ptr, ScriptObjectType ty) diff --git a/BBGE/Base.cpp b/BBGE/Base.cpp index 29ac097..ebaa09c 100644 --- a/BBGE/Base.cpp +++ b/BBGE/Base.cpp @@ -232,7 +232,7 @@ void stringToLowerUserData(std::string &s) const size_t len = userdata.length(); const bool match = (s.length() > len) && ((s[len] == '/') || (s[len] == '\\')) && - (userdata.compare(0, len, s, 0, len) == 0); + !strncmp(userdata.c_str(), s.c_str(), len); if (!match) stringToLower(s); else diff --git a/BBGE/Vector.h b/BBGE/Vector.h index b3be3ed..9cb705b 100644 --- a/BBGE/Vector.h +++ b/BBGE/Vector.h @@ -18,7 +18,8 @@ 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. */ -#pragma once +#ifndef BBGE_VECTOR_H +#define BBGE_VECTOR_H #include #include @@ -64,13 +65,13 @@ public: } // vecector equality - const bool operator==(const Vector &vec) const + bool operator==(const Vector &vec) const { return ((x == vec.x) && (y == vec.y) && (z == vec.z)); } // vecector inequality - const bool operator!=(const Vector &vec) const + bool operator!=(const Vector &vec) const { return !(*this == vec); } @@ -106,10 +107,6 @@ public: { return Vector(-x, -y, -z); } - bool isZero() - { - return x == 0 && y == 0 && z == 0; - } // vector decrement const Vector &operator-=(const Vector& vec) @@ -201,12 +198,12 @@ public: return Vector(y*vec.z - z*vec.y, z*vec.x - x*vec.z, x*vec.y - y*vec.x); } - Vector inline getPerpendicularLeft() + inline Vector getPerpendicularLeft() { return Vector(-y, x); } - Vector inline getPerpendicularRight() + inline Vector getPerpendicularRight() { return Vector(y, -x); } @@ -218,41 +215,41 @@ public: } // dot product - const scalar_t inline dot(const Vector &vec) const + inline scalar_t dot(const Vector &vec) const { return x*vec.x + y*vec.y + z*vec.z; } - const scalar_t inline dot2D(const Vector &vec) const + inline scalar_t dot2D(const Vector &vec) const { return x*vec.x + y*vec.y; } // dot product - const scalar_t operator%(const Vector &vec) const + scalar_t operator%(const Vector &vec) const { return x*vec.x + y*vec.x + z*vec.z; } // length of vector - const scalar_t inline getLength3D() const + inline scalar_t getLength3D() const { return (scalar_t)sqrtf(x*x + y*y + z*z); } - const scalar_t inline getLength2D() const + inline scalar_t getLength2D() const { return (scalar_t)sqrtf(x*x + y*y); } // return the unit vector - const Vector inline unitVector3D() const + inline const Vector unitVector3D() const { return (*this) * (1/getLength3D()); } // normalize this vector - void inline normalize3D() + inline void normalize3D() { if (x == 0 && y == 0 && z == 0) { @@ -264,7 +261,7 @@ public: (*this) *= 1/getLength3D(); } } - void inline normalize2D() + inline void normalize2D() { if (x == 0 && y == 0) { @@ -277,7 +274,7 @@ public: } } - const scalar_t operator!() const + scalar_t operator!() const { return sqrtf(x*x + y*y + z*z); } @@ -297,7 +294,7 @@ public: } */ - void inline setLength3D(const float l) + inline void setLength3D(const float l) { // IGNORE !! if (l == 0) @@ -312,7 +309,7 @@ public: this->z *= (l/len); } } - void inline setLength2D(const float l) + inline void setLength2D(const float l) { float len = getLength2D(); if (len == 0) @@ -328,24 +325,24 @@ public: } // return angle between two vectors - const float inline Angle(const Vector& normal) const + inline scalar_t Angle(const Vector& normal) const { return acosf(*this % normal); } /* - const scalar_t inline cheatLen() const + inline scalar_t cheatLen() const { return (x*x + y*y + z*z); } - const scalar_t inline cheatLen2D() const + inline scalar_t cheatLen2D() const { return (x*x + y*y); } - const scalar_t inline getCheatLength3D() const; + inline scalar_t getCheatLength3D() const; */ - const bool inline isLength2DIn(float radius) const + inline bool isLength2DIn(float radius) const { return (x*x + y*y) <= (radius*radius); } @@ -359,20 +356,20 @@ public: } */ - const void inline setZero() + inline void setZero() { this->x = this->y = this->z = 0; } - const float inline getSquaredLength2D() const + inline scalar_t getSquaredLength2D() const { return (x*x) + (y*y); } - const bool inline isZero() const + inline bool isZero() const { return x==0 && y==0 && z==0; } - const bool inline isNan() const + inline bool isNan() const { #ifdef BBGE_BUILD_WINDOWS return _isnan(x) || _isnan(y) || _isnan(z); @@ -383,11 +380,11 @@ public: #endif } - void inline capLength2D(const float l) + inline void capLength2D(const float l) { if (!isLength2DIn(l)) setLength2D(l); } - void inline capRotZ360() + inline void capRotZ360() { while (z > 360) z -= 360; @@ -573,3 +570,5 @@ public: Vector getRotatedVector(const Vector &vec, float rot); Vector lerp(const Vector &v1, const Vector &v2, float dt, int lerpType); + +#endif // BBGE_VECTOR_H diff --git a/ExternalLibs/ByteBuffer.h b/ExternalLibs/ByteBuffer.h index 377eede..8f8897b 100644 --- a/ExternalLibs/ByteBuffer.h +++ b/ExternalLibs/ByteBuffer.h @@ -6,6 +6,12 @@ #include #include +#if defined(__GNUC__) && __GNUC__ <= 2 +# define BB_OLD_GNUC +# include +#endif + + // ** compatibility stuff for BBGE .... ** @@ -26,7 +32,7 @@ namespace ByteBufferTools { - template inline void convert(char *val) + template inline void convert(char *val) { std::swap(*val, *(val + T - 1)); convert(val + 1); @@ -39,12 +45,21 @@ namespace ByteBufferTools convert((char *)(val)); } + inline void EndianConvertRT(char *p, unsigned int size) + { + std::reverse(p, p + size); + } + #if BB_IS_BIG_ENDIAN template inline void ToLittleEndian(T& val) { EndianConvert(&val); } + inline void ToLittleEndianRT(void *p, unsigned int size) { EndianConvertRT((char*)p, size); } template inline void ToBigEndian(T&) { } + inline void ToBigEndianRT(void *p, unsigned int size) { } #else template inline void ToLittleEndian(T&) { } + inline void ToLittleEndianRT(void *p, unsigned int size) { } template inline void ToBigEndian(T& val) { EndianConvert(&val); } + inline void ToBigEndianRT(void *p, unsigned int size) { EndianConvertRT((char*)p, size); } #endif template void ToLittleEndian(T*); // will generate link error @@ -52,8 +67,13 @@ namespace ByteBufferTools }; -#define BB_MAKE_WRITE_OP(T) inline ByteBuffer& operator<<(T val) { append(val); return *this; } -#define BB_MAKE_READ_OP(T) inline ByteBuffer& operator>>(T &val) { val = read(); return *this; } +#ifdef BB_OLD_GNUC +# define BB_MAKE_WRITE_OP(T) inline ByteBuffer& operator<<(T val) { appendT(&val, sizeof(T)); return *this; } +# define BB_MAKE_READ_OP(T) inline ByteBuffer& operator>>(T &val) { readT(&val, sizeof(T)); return *this; } +#else +# define BB_MAKE_WRITE_OP(T) inline ByteBuffer& operator<<(T val) { append(val); return *this; } +# define BB_MAKE_READ_OP(T) inline ByteBuffer& operator>>(T &val) { val = read(); return *this; } +#endif class ByteBuffer { @@ -241,23 +261,17 @@ public: BB_MAKE_WRITE_OP(float); BB_MAKE_WRITE_OP(double); - ByteBuffer &operator<<(bool value) - { - append((char)value); - return *this; - } - ByteBuffer &operator<<(const char *str) { append((uint8 *)str, str ? strlen(str) : 0); - append((uint8)0); + appendByte(0); return *this; } ByteBuffer &operator<<(const std::string &value) { append((uint8 *)value.c_str(), value.length()); - append((uint8)0); + appendByte(0); return *this; } @@ -271,22 +285,18 @@ public: BB_MAKE_READ_OP(float); BB_MAKE_READ_OP(double); - ByteBuffer &operator>>(bool &value) + inline uint8 operator[](uint32 pos) const { - value = read() > 0 ? true : false; - return *this; - } - - uint8 operator[](uint32 pos) - { - return read(pos); + if(pos >= size()) + BYTEBUFFER_EXCEPT(this, "operator[]", 1); + return _buf[pos]; } ByteBuffer &operator>>(std::string& value) { value.clear(); char c; - while(readable() && (c = read())) + while(readable() && (c = readByte())) value += c; return *this; } @@ -313,6 +323,7 @@ public: _rpos += sizeof(T); return r; } + template T read(uint32 pos) const { if(pos + sizeof(T) > size()) @@ -322,6 +333,20 @@ public: return val; } + inline uint8 readByte() + { + if (_rpos < size()) + return _buf[_rpos++]; + BYTEBUFFER_EXCEPT(this, "readByte", 1); + return 0; + } + + void readT(void *dest, uint32 len) + { + read(dest, len); + ByteBufferTools::ToLittleEndianRT(dest, len); + } + void read(void *dest, uint32 len) { if (_rpos + len <= size()) @@ -352,7 +377,7 @@ public: inline uint32 readable(void) const { return size() - rpos(); } inline uint32 writable(void) const { return size() - wpos(); } // free space left before realloc will occur - template void append(T value) + template inline void append(T value) { ByteBufferTools::ToLittleEndian(value); _enlargeIfReq(_wpos + sizeof(T)); @@ -362,6 +387,21 @@ public: _size = _wpos; } + inline void appendByte(uint8 value) + { + _enlargeIfReq(_wpos + 1); + _buf[_wpos++] = value; + if(_size < _wpos) + _size = _wpos; + } + + // GCC 2.95 fails with an internal error in the template function above + void appendT(const void *src, uint32 bytes) + { + append(src, bytes); + ByteBufferTools::ToLittleEndianRT(_buf + (_wpos - bytes), bytes); + } + void append(const void *src, uint32 bytes) { if (!bytes) return; @@ -382,7 +422,7 @@ public: memcpy(_buf + pos, src, bytes); } - template void put(uint32 pos, T value) + template void put(uint32 pos, const T& value) { if(pos >= size()) BYTEBUFFER_EXCEPT(this, "put", sizeof(T)); diff --git a/ExternalLibs/FileAPI.cpp b/ExternalLibs/FileAPI.cpp index 6e8ae82..02b0378 100644 --- a/ExternalLibs/FileAPI.cpp +++ b/ExternalLibs/FileAPI.cpp @@ -118,7 +118,7 @@ bool InStream::open(const char *fn) vf->dropBuf(true); return true; } - setstate(std::ios_base::failbit); + setstate(std::ios::failbit); return false; }