From bcdb7db02a3859f8f0faeb7ccc012655b3bb3f51 Mon Sep 17 00:00:00 2001 From: fluffymormegil Date: Sun, 15 May 2011 02:26:27 +0100 Subject: [PATCH] libmormegil is now bug-free enough to be a dependency of dungeonbash --- Makefile | 8 +- include/libmormegil/Coord.hh | 89 +++++++++++- include/libmormegil/abs.hh | 2 +- include/libmormegil/mathops.hh | 17 +++ include/libmormegil/serial.hh | 313 ++++++++++++++++++++++++++++++++++++----- include/libmormegil/sign.hh | 3 +- lib/libmormegil.a | Bin 0 -> 73014 bytes 7 files changed, 383 insertions(+), 49 deletions(-) create mode 100644 include/libmormegil/mathops.hh create mode 100644 lib/libmormegil.a diff --git a/Makefile b/Makefile index cfe2fff..c13e4c3 100644 --- a/Makefile +++ b/Makefile @@ -62,10 +62,10 @@ $(OBJ_BUILDDIR)/%.o: src/%.c $(OBJ_BUILDDIR)/%.o: src/%.cc $(CXX) $(CXXFLAGS) $(COMMON_FLAGS) -c $< -o $@ -$(LIBMORMEGIL_SHARED): $(LIBOBJS) +$(LIBMORMEGIL_SHARED_BUILT): $(LIBOBJS) gcc $(LINKSTEP_FLAGS) -Wl,-soname,$(LIBMORMEGIL_SONAME) $^ -o $@ -$(LIBMORMEGIL_STATIC): $(LIBOBJS) +$(LIBMORMEGIL_STATIC_BUILT): $(LIBOBJS) ar rcs $@ $^ clean: @@ -110,11 +110,11 @@ install-headers: mkdir -p $(DESTDIR)$(oldincludedir)/libmormegil install -t $(DESTDIR)$(oldincludedir)/libmormegil include/libmormegil/* mkdir -p $(DESTDIR)$(includedir)/libmormegil - install -t $(DESTDIR)$(includedir)/libmormegil include/libmormegil/* + install -m 0644 -t $(DESTDIR)$(includedir)/libmormegil include/libmormegil/* else install-headers: mkdir -p $(DESTDIR)$(includedir)/libmormegil - install -t $(DESTDIR)$(includedir)/libmormegil include/libmormegil/* + install -m 0644 -t $(DESTDIR)$(includedir)/libmormegil include/libmormegil/* endif # vim:noexpandtab:fo=croq diff --git a/include/libmormegil/Coord.hh b/include/libmormegil/Coord.hh index 4169a3f..f2045db 100644 --- a/include/libmormegil/Coord.hh +++ b/include/libmormegil/Coord.hh @@ -44,31 +44,44 @@ namespace libmormegil return *this; } - ref operator *=(const basic_offset& right) + ref operator *=(const_ref right) { y *= right.y; x *= right.x; return *this; } - bool operator <(const basic_offset& right) const + basic_offset operator -() const + { + basic_offset tmp = { -y, -x }; + return tmp; + } + + + bool operator <(const_ref right) const { return (y < right.y) || ((y == right.y) && (x < right.x)); } - bool operator ==(const basic_offset& right) const + bool operator ==(const_ref right) const { return (y == right.y) && (x == right.x); } - bool operator >(const basic_offset& right) const + bool operator !=(const_ref right) const + { + return (y != right.y) || (x != right.x); + } + + bool operator >(const_ref right) const { return (y > right.y) || ((y == right.y) && (x > right.x)); } - int length_taxi() { return abs(y) + abs(x); } - int lengthsq() { return y * y + x * x; } - int length_inf() { return std::min(abs(y), abs(x)); } + int length_taxi() const { return abs(y) + abs(x); } + int lengthsq() const { return y * y + x * x; } + int length_inf() const { return std::max(abs(y), abs(x)); } + bool cardinal() const { return (abs(y) == abs(x)) || (y && !x) || (x && !y); } }; template struct basic_coord @@ -110,6 +123,17 @@ namespace libmormegil return (y == right.y) && (x == right.x); } + bool operator !=(const_ref right) const + { + return (y != right.y) || (x != right.x); + } + + basic_coord operator -() const + { + basic_coord tmp = { -y, -x }; + return tmp; + } + bool operator >(const_ref right) const { return (y > right.y) || ((y == right.y) && (x > right.x)); @@ -141,11 +165,62 @@ namespace libmormegil return std::max(abs(y), abs(x)); } }; + template inline basic_coord operator +(const basic_coord& left, const basic_offset& right) + { + basic_coord tmp = { left.y + right.y, left.x + right.x }; + return tmp; + } + template inline basic_coord operator -(const basic_coord& left, const basic_offset& right) + { + basic_coord tmp = { left.y - right.y, left.x - right.x }; + return tmp; + } typedef basic_offset Offset; typedef basic_coord Coord; typedef basic_offset Offset64; typedef basic_coord Coord64; + + template<> inline Offset abs(const Offset& t) + { + Offset tmp = { abs(t.y), abs(t.x) }; + return tmp; + } + template<> inline Offset64 abs(const Offset64& t) + { + Offset64 tmp = { abs(t.y), abs(t.x) }; + return tmp; + } + template<> inline Coord abs(const Coord& t) + { + Coord tmp = { abs(t.y), abs(t.x) }; + return tmp; + } + template<> inline Coord64 abs(const Coord64& t) + { + Coord64 tmp = { abs(t.y), abs(t.x) }; + return tmp; + } + template<> inline Offset sign(const Offset& t) + { + Offset tmp = { sign(t.y), sign(t.x) }; + return tmp; + } + template<> inline Offset64 sign(const Offset64& t) + { + Offset64 tmp = { sign(t.y), sign(t.x) }; + return tmp; + } + template<> inline Coord sign(const Coord& t) + { + Coord tmp = { sign(t.y), sign(t.x) }; + return tmp; + } + template<> inline Coord64 sign(const Coord64& t) + { + Coord64 tmp = { sign(t.y), sign(t.x) }; + return tmp; + } } #endif // libmormegil_Coord_hh diff --git a/include/libmormegil/abs.hh b/include/libmormegil/abs.hh index dc520a9..30fbb2a 100644 --- a/include/libmormegil/abs.hh +++ b/include/libmormegil/abs.hh @@ -12,7 +12,7 @@ namespace libmormegil { template inline T abs(const T& i) { - i < T(0) ? -i : i; + return i < T(0) ? -i : i; } } #endif // libmormegil_abs_hh diff --git a/include/libmormegil/mathops.hh b/include/libmormegil/mathops.hh new file mode 100644 index 0000000..6c37e84 --- /dev/null +++ b/include/libmormegil/mathops.hh @@ -0,0 +1,17 @@ +// libmormegil/mathops.hh +// +// In jurisdictions where this file would be adjuged to contain copyrightable +// material, it is copyright 2011 Martin Read, and released to the public +// under the terms of the Creative Commons Public Domain Dedication (cc-0). +// It is provided without any warranty, express or implied. + +#ifndef libmormegil_mathops_hh +#define libmormegil_mathops_hh + +#include +#include +#include + +#endif // libmormegil_mathops_hh + +// vim:ts=8:sw=4:expandtab:fo=c diff --git a/include/libmormegil/serial.hh b/include/libmormegil/serial.hh index e0fcd3c..3ad6e68 100644 --- a/include/libmormegil/serial.hh +++ b/include/libmormegil/serial.hh @@ -14,8 +14,25 @@ namespace libmormegil { + inline void checked_fwrite(const void *buf, size_t sz, size_t count, FILE *fp) + { + int i = fwrite(buf, sz, count, fp); + if (i != count) + { + throw(errno); + } + } + + inline void checked_fread(void *buf, size_t sz, size_t count, FILE *fp) + { + int i = fread(buf, sz, count, fp); + if (i != count) + { + throw(errno); + } + } - inline int serialize(FILE *fp, const int64_t *data) + inline int serialize_uc(FILE *fp, int64_t data) { unsigned char buf[8]; for (int i = 0; i < 8; ++i) @@ -25,7 +42,7 @@ namespace libmormegil return fwrite(buf, 8, 1, fp); } - inline int serialize(FILE *fp, const int32_t *data) + inline int serialize_uc(FILE *fp, int32_t data) { unsigned char buf[4]; for (int i = 0; i < 4; ++i) @@ -35,7 +52,7 @@ namespace libmormegil return fwrite(buf, 4, 1, fp); } - inline int serialize(FILE *fp, const int16_t *data) + inline int serialize_uc(FILE *fp, int16_t data) { unsigned char buf[2]; for (int i = 0; i < 2; ++i) @@ -45,7 +62,7 @@ namespace libmormegil return fwrite(buf, 2, 1, fp); } - inline int serialize(FILE *fp, const uint64_t *data) + inline int serialize_uc(FILE *fp, uint64_t data) { unsigned char buf[8]; for (int i = 0; i < 8; ++i) @@ -55,7 +72,7 @@ namespace libmormegil return fwrite(buf, 8, 1, fp); } - inline int serialize(FILE *fp, const uint32_t *data) + inline int serialize_uc(FILE *fp, uint32_t data) { unsigned char buf[4]; for (int i = 0; i < 4; ++i) @@ -65,7 +82,7 @@ namespace libmormegil return fwrite(buf, 4, 1, fp); } - inline int serialize(FILE *fp, const uint16_t *data) + inline int serialize_uc(FILE *fp, uint16_t data) { unsigned char buf[2]; for (int i = 0; i < 2; ++i) @@ -75,39 +92,46 @@ namespace libmormegil return fwrite(buf, 2, 1, fp); } - inline int serialize(FILE *fp, Coord const *data) + inline int serialize_uc(FILE *fp, bool data) + { + unsigned char buf; + buf = data ? 1 : 0; + return fwrite(&buf, 1, 1, fp); + } + + inline int serialize_uc(FILE *fp, Coord const& data) { int i1, i2; - i1 = serialize(fp, &data->y); - i2 = serialize(fp, &data->x); + i1 = serialize_uc(fp, data.y); + i2 = serialize_uc(fp, data.x); return (i1 > 0) && (i2 > 0) ? 0 : -1; } - inline int serialize(FILE *fp, Coord64 const *data) + inline int serialize_uc(FILE *fp, Coord64 const& data) { int i1, i2; - i1 = serialize(fp, &data->y); - i2 = serialize(fp, &data->x); + i1 = serialize_uc(fp, data.y); + i2 = serialize_uc(fp, data.x); return (i1 > 0) && (i2 > 0) ? 0 : -1; } - inline int serialize(FILE *fp, Offset64 const *data) + inline int serialize_uc(FILE *fp, Offset64 const& data) { int i1, i2; - i1 = serialize(fp, &data->y); - i2 = serialize(fp, &data->x); + i1 = serialize_uc(fp, data.y); + i2 = serialize_uc(fp, data.x); return (i1 > 0) && (i2 > 0) ? 0 : -1; } - inline int serialize(FILE *fp, Offset const *data) + inline int serialize_uc(FILE *fp, Offset const& data) { int i1, i2; - i1 = serialize(fp, &data->y); - i2 = serialize(fp, &data->x); + i1 = serialize_uc(fp, data.y); + i2 = serialize_uc(fp, data.x); return (i1 > 0) && (i2 > 0) ? 0 : -1; } - inline int deserialize(FILE *fp, int64_t *data) + inline int deserialize_uc(FILE *fp, int64_t *data) { unsigned char buf[8]; int64_t tmp; @@ -125,7 +149,7 @@ namespace libmormegil return r; } - inline int deserialize(FILE *fp, int32_t *data) + inline int deserialize_uc(FILE *fp, int32_t *data) { unsigned char buf[4]; int32_t tmp; @@ -142,7 +166,7 @@ namespace libmormegil return r; } - inline int deserialize(FILE *fp, int16_t *data) + inline int deserialize_uc(FILE *fp, int16_t *data) { unsigned char buf[2]; int32_t tmp; @@ -159,7 +183,7 @@ namespace libmormegil return r; } - inline int deserialize(FILE *fp, uint64_t *data) + inline int deserialize_uc(FILE *fp, uint64_t *data) { unsigned char buf[8]; uint64_t tmp; @@ -177,7 +201,7 @@ namespace libmormegil return r; } - inline int deserialize(FILE *fp, uint32_t *data) + inline int deserialize_uc(FILE *fp, uint32_t *data) { unsigned char buf[4]; uint32_t tmp; @@ -194,7 +218,7 @@ namespace libmormegil return r; } - inline int deserialize(FILE *fp, uint16_t *data) + inline int deserialize_uc(FILE *fp, uint16_t *data) { unsigned char buf[2]; uint32_t tmp; @@ -211,38 +235,255 @@ namespace libmormegil return r; } - inline int deserialize(FILE *fp, Coord *data) + inline int deserialize_uc(FILE *fp, bool *data) + { + unsigned char buf; + int r = fread(&buf, 1, 1, fp); + if (r > 0) + { + *data = bool(buf); + } + return r; + } + + inline int deserialize_uc(FILE *fp, Coord *data) { int i1, i2; - i1 = deserialize(fp, &data->y); - i2 = deserialize(fp, &data->x); + i1 = deserialize_uc(fp, &data->y); + i2 = deserialize_uc(fp, &data->x); return (i1 > 0) && (i2 > 0) ? 0 : -1; } - inline int deserialize(FILE *fp, Coord64 *data) + inline int deserialize_uc(FILE *fp, Coord64 *data) { int i1, i2; - i1 = deserialize(fp, &data->y); - i2 = deserialize(fp, &data->x); + i1 = deserialize_uc(fp, &data->y); + i2 = deserialize_uc(fp, &data->x); return (i1 > 0) && (i2 > 0) ? 0 : -1; } - inline int deserialize(FILE *fp, Offset *data) + inline int deserialize_uc(FILE *fp, Offset *data) { int i1, i2; - i1 = deserialize(fp, &data->y); - i2 = deserialize(fp, &data->x); + i1 = deserialize_uc(fp, &data->y); + i2 = deserialize_uc(fp, &data->x); return (i1 > 0) && (i2 > 0) ? 0 : -1; } - inline int deserialize(FILE *fp, Offset64 *data) + inline int deserialize_uc(FILE *fp, Offset64 *data) { int i1, i2; - i1 = deserialize(fp, &data->y); - i2 = deserialize(fp, &data->x); + i1 = deserialize_uc(fp, &data->y); + i2 = deserialize_uc(fp, &data->x); return (i1 > 0) && (i2 > 0) ? 0 : -1; } + inline void serialize(FILE *fp, int64_t data) + { + unsigned char buf[8]; + for (int i = 0; i < 8; ++i) + { + buf[i] = data >> ((7 - i) << 3); + } + checked_fwrite(buf, 8, 1, fp); + } + + inline void serialize(FILE *fp, int32_t data) + { + unsigned char buf[4]; + for (int i = 0; i < 4; ++i) + { + buf[i] = data >> ((3 - i) << 3); + } + checked_fwrite(buf, 4, 1, fp); + } + + inline void serialize(FILE *fp, int16_t data) + { + unsigned char buf[2]; + for (int i = 0; i < 2; ++i) + { + buf[i] = data >> ((1 - i) << 3); + } + checked_fwrite(buf, 2, 1, fp); + } + + inline void serialize(FILE *fp, uint64_t data) + { + unsigned char buf[8]; + for (int i = 0; i < 8; ++i) + { + buf[i] = data >> ((7 - i) << 3); + } + checked_fwrite(buf, 8, 1, fp); + } + + inline void serialize(FILE *fp, uint32_t data) + { + unsigned char buf[4]; + for (int i = 0; i < 4; ++i) + { + buf[i] = data >> ((3 - i) << 3); + } + checked_fwrite(buf, 4, 1, fp); + } + + inline void serialize(FILE *fp, uint16_t data) + { + unsigned char buf[2]; + for (int i = 0; i < 2; ++i) + { + buf[i] = data >> ((1 - i) << 3); + } + checked_fwrite(buf, 2, 1, fp); + } + + inline int serialize(FILE *fp, bool data) + { + unsigned char buf; + buf = data ? 1 : 0; + checked_fwrite(&buf, 1, 1, fp); + } + + inline void serialize(FILE *fp, Coord const& data) + { + serialize(fp, data.y); + serialize(fp, data.x); + } + + inline void serialize(FILE *fp, Coord64 const& data) + { + serialize(fp, data.y); + serialize(fp, data.x); + } + + inline void serialize(FILE *fp, Offset64 const& data) + { + serialize(fp, data.y); + serialize(fp, data.x); + } + + inline void serialize(FILE *fp, Offset const& data) + { + serialize(fp, data.y); + serialize(fp, data.x); + } + + inline void deserialize(FILE *fp, int64_t *data) + { + unsigned char buf[8]; + int64_t tmp; + checked_fread(buf, 8, 1, fp); + tmp = 0; + for (int i = 0; i < 8; ++i) + { + tmp <<= 8; + tmp |= buf[i]; + } + *data = tmp; + } + + inline void deserialize(FILE *fp, int32_t *data) + { + unsigned char buf[4]; + int32_t tmp; + checked_fread(buf, 4, 1, fp); + for (int i = 0; i < 4; ++i) + { + tmp <<= 8; + tmp |= buf[i]; + } + *data = tmp; + } + + inline void deserialize(FILE *fp, int16_t *data) + { + unsigned char buf[2]; + int32_t tmp; + checked_fread(buf, 2, 1, fp); + for (int i = 0; i < 2; ++i) + { + tmp <<= 8; + tmp |= buf[i]; + } + *data = tmp; + } + + inline void deserialize(FILE *fp, uint64_t *data) + { + unsigned char buf[8]; + uint64_t tmp; + checked_fread(buf, 8, 1, fp); + tmp = 0; + for (int i = 0; i < 8; ++i) + { + tmp <<= 8; + tmp |= buf[i]; + } + *data = tmp; + } + + inline void deserialize(FILE *fp, uint32_t *data) + { + unsigned char buf[4]; + uint32_t tmp; + checked_fread(buf, 4, 1, fp); + for (int i = 0; i < 4; ++i) + { + tmp <<= 8; + tmp |= buf[i]; + } + *data = tmp; + } + + inline void deserialize(FILE *fp, uint16_t *data) + { + unsigned char buf[2]; + uint32_t tmp; + checked_fread(buf, 2, 1, fp); + for (int i = 0; i < 2; ++i) + { + tmp <<= 8; + tmp |= buf[i]; + } + *data = tmp; + } + + inline int deserialize(FILE *fp, bool *data) + { + unsigned char buf; + checked_fread(&buf, 1, 1, fp); + *data = bool(buf); + } + + inline void deserialize(FILE *fp, Coord *data) + { + int i1, i2; + deserialize(fp, &data->y); + deserialize(fp, &data->x); + } + + inline void deserialize(FILE *fp, Coord64 *data) + { + int i1, i2; + deserialize(fp, &data->y); + deserialize(fp, &data->x); + } + + inline void deserialize(FILE *fp, Offset *data) + { + int i1, i2; + deserialize(fp, &data->y); + deserialize(fp, &data->x); + } + + inline void deserialize(FILE *fp, Offset64 *data) + { + int i1, i2; + deserialize(fp, &data->y); + deserialize(fp, &data->x); + } + } #endif diff --git a/include/libmormegil/sign.hh b/include/libmormegil/sign.hh index 754dbe1..5ee887d 100644 --- a/include/libmormegil/sign.hh +++ b/include/libmormegil/sign.hh @@ -9,7 +9,8 @@ #define libmormegil_sign_hh namespace libmormegil - template inline bool sign(const T& i) +{ + template inline T sign(const T& i) { return (i < T(0)) ? -1 : (i > T(0)) ? 1 : 0; } diff --git a/lib/libmormegil.a b/lib/libmormegil.a new file mode 100644 index 0000000000000000000000000000000000000000..b69c3b1c01953f0a67a9af58dd335fdafcd69f2f GIT binary patch literal 73014 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 KNV~-Q-~SImsI@!* literal 0 HcmV?d00001 -- 2.11.0