From: <m97...@us...> - 2007-06-27 14:31:24
|
Revision: 6672 http://svn.sourceforge.net/openmsx/?rev=6672&view=rev Author: m9710797 Date: 2007-06-27 07:31:15 -0700 (Wed, 27 Jun 2007) Log Message: ----------- created new directory 'utils' and moved several files into it Modified Paths: -------------- openmsx/trunk/ChangeLog openmsx/trunk/src/fdc/node.mk openmsx/trunk/src/file/node.mk openmsx/trunk/src/node.mk openmsx/trunk/src/video/node.mk Added Paths: ----------- openmsx/trunk/src/utils/ openmsx/trunk/src/utils/CRC16.cc openmsx/trunk/src/utils/CRC16.hh openmsx/trunk/src/utils/CircularBuffer.cc openmsx/trunk/src/utils/CircularBuffer.hh openmsx/trunk/src/utils/Date.cc openmsx/trunk/src/utils/Date.hh openmsx/trunk/src/utils/FixedPoint.hh openmsx/trunk/src/utils/HostCPU.cc openmsx/trunk/src/utils/HostCPU.hh openmsx/trunk/src/utils/Math.cc openmsx/trunk/src/utils/Math.hh openmsx/trunk/src/utils/MemoryOps.cc openmsx/trunk/src/utils/MemoryOps.hh openmsx/trunk/src/utils/Observer.hh openmsx/trunk/src/utils/ScopedAssign.hh openmsx/trunk/src/utils/StringOp.cc openmsx/trunk/src/utils/StringOp.hh openmsx/trunk/src/utils/Subject.hh openmsx/trunk/src/utils/Unicode.cc openmsx/trunk/src/utils/Unicode.hh openmsx/trunk/src/utils/checked_cast.hh openmsx/trunk/src/utils/likely.hh openmsx/trunk/src/utils/node.mk openmsx/trunk/src/utils/noncopyable.hh openmsx/trunk/src/utils/sha1.cc openmsx/trunk/src/utils/sha1.hh openmsx/trunk/src/utils/shared_ptr.hh Removed Paths: ------------- openmsx/trunk/src/CircularBuffer.cc openmsx/trunk/src/CircularBuffer.hh openmsx/trunk/src/FixedPoint.hh openmsx/trunk/src/HostCPU.cc openmsx/trunk/src/HostCPU.hh openmsx/trunk/src/Math.cc openmsx/trunk/src/Math.hh openmsx/trunk/src/Observer.hh openmsx/trunk/src/ScopedAssign.hh openmsx/trunk/src/StringOp.cc openmsx/trunk/src/StringOp.hh openmsx/trunk/src/Subject.hh openmsx/trunk/src/Unicode.cc openmsx/trunk/src/Unicode.hh openmsx/trunk/src/checked_cast.hh openmsx/trunk/src/fdc/CRC16.cc openmsx/trunk/src/fdc/CRC16.hh openmsx/trunk/src/file/Date.cc openmsx/trunk/src/file/Date.hh openmsx/trunk/src/likely.hh openmsx/trunk/src/noncopyable.hh openmsx/trunk/src/sha1.cc openmsx/trunk/src/sha1.hh openmsx/trunk/src/shared_ptr.hh openmsx/trunk/src/video/MemoryOps.cc openmsx/trunk/src/video/MemoryOps.hh Modified: openmsx/trunk/ChangeLog =================================================================== --- openmsx/trunk/ChangeLog 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/ChangeLog 2007-06-27 14:31:15 UTC (rev 6672) @@ -1,5 +1,8 @@ $Id$ +2007-06-27 Wouter Vermaelen <wou...@sc...> + * Created new directory 'utils' and moved several files into it + 2007-06-26 Manuel Bilderbeek <ma...@ms...> * Added Software and Creation Date info to AVI files. * Added Creation Time info to PNG files (Software was already there). Deleted: openmsx/trunk/src/CircularBuffer.cc =================================================================== --- openmsx/trunk/src/CircularBuffer.cc 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/CircularBuffer.cc 2007-06-27 14:31:15 UTC (rev 6672) @@ -1,50 +0,0 @@ -// $Id$ - -#if 0 - -#include "CircularBuffer.hh" -#include <iostream> - -int main() -{ - openmsx::CircularBuffer<int, 2> buf; - assert(buf.isEmpty()); - assert(!buf.isFull()); - assert(buf.size() == 0); - - buf.addBack(15); - assert(!buf.isEmpty()); - assert(!buf.isFull()); - assert(buf.size() == 1); - assert(buf[0] == 15); - - buf[0] = 25; - assert(buf[0] == 25); - - buf.addFront(17); - assert(!buf.isEmpty()); - assert(buf.isFull()); - assert(buf.size() == 2); - assert(buf[0] == 17); - assert(buf[1] == 25); - - buf[1] = 35; - assert(buf[0] == 17); - assert(buf[1] == 35); - buf[0] = 27; - assert(buf[0] == 27); - assert(buf[1] == 35); - - int a = buf.removeBack(); - assert(a == 35); - assert(buf.size() == 1); - assert(buf[0] == 27); - - int b = buf.removeFront(); - assert(b == 27); - assert(buf.isEmpty()); - - std::cout << "Test passed!" << std::endl; -} - -#endif Deleted: openmsx/trunk/src/CircularBuffer.hh =================================================================== --- openmsx/trunk/src/CircularBuffer.hh 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/CircularBuffer.hh 2007-06-27 14:31:15 UTC (rev 6672) @@ -1,79 +0,0 @@ -// $Id$ - -#ifndef CIRCULARBUFFER_HH -#define CIRCULARBUFFER_HH - -#include <cassert> - -namespace openmsx { - -template<class T, unsigned MAXSIZE> -class CircularBuffer -{ -public: - CircularBuffer() - : first(0), last(0) - { - } - void addFront(const T& element) { - assert(!isFull()); - first = prev(first); - buffer[first] = element; - } - void addBack(const T& element) { - assert(!isFull()); - buffer[last] = element; - last = next(last); - } - T& removeFront() { - assert(!isEmpty()); - unsigned tmp = first; - first = next(first); - return buffer[tmp]; - } - T& removeBack() { - assert(!isEmpty()); - last = prev(last); - return buffer[last]; - } - T& operator[](unsigned pos) { - assert(pos < MAXSIZE); - unsigned tmp = first + pos; - if (tmp > MAXSIZE) { - tmp -= (MAXSIZE + 1); - } - return buffer[tmp]; - } - const T& operator[](unsigned pos) const { - return const_cast<CircularBuffer&>(*this)[pos]; - } - bool isEmpty() const { - return (first == last); - } - bool isFull() const { - return (first == next(last)); - } - unsigned size() const { - if (first > last) { - return MAXSIZE + 1 - first + last; - } else { - return last - first; - } - } - -private: - inline unsigned next(unsigned a) const { - return (a != MAXSIZE) ? a + 1 : 0; - } - inline unsigned prev(unsigned a) const { - return (a != 0) ? a - 1 : MAXSIZE; - } - - unsigned first, last; - // one extra to be able to distinguish full and empty - T buffer[MAXSIZE + 1]; -}; - -} // namespace openmsx - -#endif Deleted: openmsx/trunk/src/FixedPoint.hh =================================================================== --- openmsx/trunk/src/FixedPoint.hh 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/FixedPoint.hh 2007-06-27 14:31:15 UTC (rev 6672) @@ -1,220 +0,0 @@ -// $Id$ - -#ifndef FIXEDPOINT_HH -#define FIXEDPOINT_HH - -#include <cmath> - -namespace openmsx { - -/** A fixed point number, implemented by a 32-bit signed integer. - * The FRACTION_BITS template argument selects the position of the "binary - * point" (base 2 equivalent to decimal point). - */ -template <unsigned FRACTION_BITS> -class FixedPoint { -private: - /** Fixed point representation of 1. - */ - static const int ONE = 1 << FRACTION_BITS; - - /** Precalculated float value of 1 / ONE. - */ - static const float INV_ONE_F = 1.0f / ONE; - - /** Precalculated double value of 1 / ONE. - */ - static const double INV_ONE_D = 1.0 / ONE; - - /** Bitmask to filter out the fractional part of a fixed point - * representation. - */ - static const int FRACTION_MASK = ONE - 1; - - /** Create new fixed point object from given representation. - * Used by the overloaded operators. - * @param value the internal representation. - */ - static inline FixedPoint create(const int value) { - FixedPoint ret; - ret.value = value; - return ret; - } - -public: - /** Creates an uninitialized fixed point object. - * This must be public to allow arrays of FixedPoint objects. - */ - explicit FixedPoint() {} - - // Conversion to fixed point: - - explicit FixedPoint(const int i) : value(i << FRACTION_BITS) {} - explicit FixedPoint(const unsigned i) : value(i << FRACTION_BITS) {} - explicit FixedPoint(const float f) : value(lrintf(f * ONE)) {} - explicit FixedPoint(const double d) : value(lrint(d * ONE)) {} - - // Conversion from fixed point: - - /** - * Returns the integer part (rounded down) of this fixed point number. - * Note that for negative numbers, rounding occurs away from zero. - */ - int toInt() const { - return value >> FRACTION_BITS; - } - - /** - * Returns the float value that corresponds to this fixed point number. - */ - float toFloat() const { - return value * INV_ONE_F; - } - - /** - * Returns the double value that corresponds to this fixed point number. - */ - double toDouble() const { - return value * INV_ONE_D; - } - - /** - * Returns the fractional part of this fixed point number as a float. - * The fractional part is never negative, even for negative fixed point - * numbers. - * x.toInt() + x.fractionAsFloat() is approximately equal to x.toFloat() - */ - float fractionAsFloat() const { - return (value & FRACTION_MASK) * INV_ONE_F; - } - - /** - * Returns the fractional part of this fixed point number as a double. - * The fractional part is never negative, even for negative fixed point - * numbers. - * x.toInt() + x.fractionAsDouble() is approximately equal to x.toDouble() - */ - double fractionAsDouble() const { - return (value & FRACTION_MASK) * INV_ONE_D; - } - - // Various arithmetic: - - /** - * Returns the result of a division between this fixed point number and - * another, rounded towards zero. - */ - int divAsInt(const FixedPoint other) const { - return value / other.value; - } - - /** - * Returns this value rounded down. - * The result is equal to FixedPoint(fp.toInt()). - */ - FixedPoint floor() const { - return create(value & ~FRACTION_MASK); - } - - /** - * Returns the fractional part of this value. - * The result is equal to fp - floor(fp). - */ - FixedPoint fract() const { - return create(value & FRACTION_MASK); - } - - /** - * Returns the fractional part of this value as an integer. - * The result is equal to (fract() * (1 << FRACTION_BITS)).toInt() - */ - unsigned fractAsInt() const { - return value & FRACTION_MASK; - } - - // Arithmetic operators: - - FixedPoint operator+(const FixedPoint other) const { - return create(value + other.value); - } - FixedPoint operator-(const FixedPoint other) const { - return create(value - other.value); - } - FixedPoint operator*(const FixedPoint other) const { - return create(static_cast<int>( - (static_cast<long long int>(value) * other.value) >> FRACTION_BITS - )); - } - FixedPoint operator*(const int i) const { - return create(value * i); - } - /** - * Divides two fixed point numbers. - * The fractional part is rounded down. - */ - FixedPoint operator/(const FixedPoint other) const { - return create(static_cast<int>( - (static_cast<long long int>(value) << FRACTION_BITS) / other.value - )); - } - FixedPoint operator/(const int i) const { - return create(value / i); - } - FixedPoint operator<<(const int b) const { - return create(value << b); - } - FixedPoint operator>>(const int b) const { - return create(value >> b); - } - - // Comparison operators: - - bool operator==(const FixedPoint other) const { - return value == other.value; - } - bool operator!=(const FixedPoint other) const { - return value != other.value; - } - bool operator<(const FixedPoint other) const { - return value < other.value; - } - bool operator<=(const FixedPoint other) const { - return value <= other.value; - } - bool operator>(const FixedPoint other) const { - return value > other.value; - } - bool operator>=(const FixedPoint other) const { - return value >= other.value; - } - - // Arithmetic operators that modify this object: - - void operator+=(const FixedPoint other) { - value += other.value; - } - void operator-=(const FixedPoint other) { - value -= other.value; - } - -private: - int value; -}; - -// Force all constants being defined, some compilers need this: - -template <unsigned FRACTION_BITS> -const int FixedPoint<FRACTION_BITS>::ONE; - -template <unsigned FRACTION_BITS> -const float FixedPoint<FRACTION_BITS>::INV_ONE_F; - -template <unsigned FRACTION_BITS> -const double FixedPoint<FRACTION_BITS>::INV_ONE_D; - -template <unsigned FRACTION_BITS> -const int FixedPoint<FRACTION_BITS>::FRACTION_MASK; - -} // namespace openmsx - -#endif // FIXEDPOINT_HH Deleted: openmsx/trunk/src/HostCPU.cc =================================================================== --- openmsx/trunk/src/HostCPU.cc 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/HostCPU.cc 2007-06-27 14:31:15 UTC (rev 6672) @@ -1,83 +0,0 @@ -// $Id$ - -#include "HostCPU.hh" -#include "openmsx.hh" -#include <cassert> - -namespace openmsx { - -HostCPU::HostCPU() -{ - mmxFlag = false; - sseFlag = false; - sse2Flag = false; - #ifdef ASM_X86_32 - // Note: On Mac OS X, EBX is in use by the OS, - // so we have to restore it. - // Is CPUID instruction supported? - unsigned hasCPUID; - asm ( - // Load EFLAGS into EAX. - "pushfl;" - "popl %%eax;" - // Save current value. - "movl %%eax,%%ecx;" - // Toggle bit 21. - "xorl $0x200000, %%eax;" - // Load EAX into EFLAGS. - "pushl %%eax;" - "popfl;" - // Load EFLAGS into EAX. - "pushfl;" - "popl %%eax;" - // Did bit 21 change? - "xor %%ecx, %%eax;" - "andl $0x200000, %%eax;" - : "=a" (hasCPUID) // 0 - : // no input - : "ecx" - ); - if (hasCPUID) { - // Which CPUID calls are supported? - unsigned highest; - asm ( - "pushl %%ebx;" - "cpuid;" - "popl %%ebx;" - : "=a" (highest) // 0 - : "0" (0) // 1: function - : "ecx", "edx" - ); - if (highest >= 1) { - // Get features flags. - unsigned features; - asm ( - "pushl %%ebx;" - "cpuid;" - "popl %%ebx;" - : "=d" (features) // 0 - : "a" (1) // 1: function - : "ecx" - ); - mmxFlag = features & 0x0800000; - sseFlag = features & 0x2000000; - sse2Flag = features & 0x4000000; - } - } - #endif - #ifdef ASM_X86_64 - // X86_64 machines always have mmx, sse, sse2 - mmxFlag = true; - sseFlag = true; - sse2Flag = true; - #endif - - PRT_DEBUG("MMX: " << mmxFlag); - PRT_DEBUG("SSE: " << sseFlag); - PRT_DEBUG("SSE2: " << sse2Flag); - - if (hasSSE2()) { assert(hasMMX() && hasSSE()); } - if (hasSSE()) { assert(hasMMX()); } -} - -} // namespace openmsx Deleted: openmsx/trunk/src/HostCPU.hh =================================================================== --- openmsx/trunk/src/HostCPU.hh 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/HostCPU.hh 2007-06-27 14:31:15 UTC (rev 6672) @@ -1,66 +0,0 @@ -// $Id$ - -#ifndef HOSTCPU_HH -#define HOSTCPU_HH - -#include "noncopyable.hh" -#include "build-info.hh" - -namespace openmsx { - -/** Information about the host CPU's capabilities, - * which are determined at run time. - * Query capabilities like this:<pre> - * \#ifdef ASM_X86 - * if (cpu.hasMMX()) { ...inline MMX asm... } - * \#endif</pre> - * This makes sure instructions for a different CPU family are never fed - * to the assembler, which may not be able to handle them. - */ -class HostCPU : private noncopyable -{ -public: - /** Get singleton instance. - * Note: even though a machine may have multiple CPUs, - * they are of the same type (at least for PCs). - */ - static HostCPU& getInstance() { - static HostCPU INSTANCE; - return INSTANCE; - } - - /** Does this CPU support the MMX instructions? - */ - bool hasMMX() const { return mmxFlag; } - - /** Does this CPU support the SSE instructions? - */ - bool hasSSE() const { return sseFlag; } - - /** Does this CPU support the SSE2 instructions? - */ - bool hasSSE2() const { return sse2Flag; } - - /** Force openMSX to not use any MMX instructions, if available - */ - void forceDisableMMX() { mmxFlag = false; forceDisableSSE(); } - - /** Force openMSX to not use any SSE (or MMX extensions), if available - */ - void forceDisableSSE() { sseFlag = false; forceDisableSSE2(); } - - /** Force openMSX to not use any SSE2 instructions, if available - */ - void forceDisableSSE2() { sse2Flag = false; } - -private: - HostCPU(); - - bool mmxFlag; - bool sseFlag; - bool sse2Flag; -}; - -} // namespace openmsx - -#endif Deleted: openmsx/trunk/src/Math.cc =================================================================== --- openmsx/trunk/src/Math.cc 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/Math.cc 2007-06-27 14:31:15 UTC (rev 6672) @@ -1,37 +0,0 @@ -// $Id$ - -#include "Math.hh" - -namespace openmsx { - -namespace Math { - -unsigned powerOfTwo(unsigned a) -{ - // classical implementation: - // unsigned res = 1; - // while (a > res) res <<= 1; - // return res; - - // optimized version - a += (a == 0); // can be removed if argument is never zero - return floodRight(a - 1) + 1; -} - -void gaussian2(double& r1, double& r2) -{ - static const double S = 2.0 / RAND_MAX; - double x1, x2, w; - do { - x1 = S * rand() - 1.0; - x2 = S * rand() - 1.0; - w = x1 * x1 + x2 * x2; - } while (w >= 1.0); - w = sqrt((-2.0 * log(w)) / w); - r1 = x1 * w; - r2 = x2 * w; -} - -} // namespace Math - -} // namespace openmsx Deleted: openmsx/trunk/src/Math.hh =================================================================== --- openmsx/trunk/src/Math.hh 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/Math.hh 2007-06-27 14:31:15 UTC (rev 6672) @@ -1,108 +0,0 @@ -// $Id$ - -#ifndef MATH_HH -#define MATH_HH - -#include "openmsx.hh" -#include <algorithm> -#include <cmath> - -namespace openmsx { - -namespace Math { - -/** Returns the smallest number that is both >=a and a power of two. - */ -unsigned powerOfTwo(unsigned a); - -void gaussian2(double& r1, double& r2); - -/** Clips x to the range [LO,HI]. - * Slightly faster than std::min(HI, std::max(LO, x)) - * especially when no clipping is required. - */ -template <int LO, int HI> -inline int clip(int x) -{ - return unsigned(x - LO) <= unsigned(HI - LO) ? x : (x < HI ? LO : HI); -} - -/** Clip x to range [-32768,32767]. Special case of the version above. - * Optimized for the case when no clipping is needed. - */ -inline short clipIntToShort(int x) -{ - return short(x) == x ? x : (0x7FFF - (x >> 31)); -} - -/** Clips r * factor to the range [LO,HI]. - */ -template <int LO, int HI> -inline int clip(double r, double factor) -{ - int a = (int)round(r * factor); - return std::min(std::max(a, LO), HI); -} - -/** Calculate greatest common divider of two strictly positive integers. - * Classical implementation is like this: - * while (unsigned t = b % a) { b = a; a = t; } - * return a; - * The following implementation avoids the costly modulo operation. It - * is about 40% faster on my machine. - * - * require: a != 0 && b != 0 - */ -inline unsigned gcd(unsigned a, unsigned b) -{ - unsigned k = 0; - while (((a & 1) == 0) && ((b & 1) == 0)) { - a >>= 1; b >>= 1; ++k; - } - - // either a or b (or both) is odd - while ((a & 1) == 0) a >>= 1; - while ((b & 1) == 0) b >>= 1; - - // both a and b odd - while (a != b) { - if (a >= b) { - a -= b; - do { a >>= 1; } while ((a & 1) == 0); - } else { - b -= a; - do { b >>= 1; } while ((b & 1) == 0); - } - } - return b << k; -} - -inline byte reverseByte(byte a) -{ - // classical implementation (can be extended to 16 and 32 bits) - // a = ((a & 0xF0) >> 4) | ((a & 0x0F) << 4); - // a = ((a & 0xCC) >> 2) | ((a & 0x33) << 2); - // a = ((a & 0xAA) >> 1) | ((a & 0x55) << 1); - // return a; - - // This only works for 8 bits (on a 32 bit machine) but it's slightly faster - // Found trick on this page: - // http://graphics.stanford.edu/~seander/bithacks.html - return ((a * 0x0802LU & 0x22110LU) | (a * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16; -} - -inline unsigned floodRight(unsigned x) -{ - x |= x >> 1; - x |= x >> 2; - x |= x >> 4; - x |= x >> 8; - x |= x >> 16; - return x; -} - -} // namespace Math - -} // namespace openmsx - -#endif // MATH_HH Deleted: openmsx/trunk/src/Observer.hh =================================================================== --- openmsx/trunk/src/Observer.hh 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/Observer.hh 2007-06-27 14:31:15 UTC (rev 6672) @@ -1,22 +0,0 @@ -// $Id$ - -#ifndef OBSERVER_HH -#define OBSERVER_HH - -namespace openmsx { - -/** - * Generic Gang-of-Four Observer class, templatized edition. - */ -template <typename T> class Observer -{ -public: - virtual void update(const T& subject) = 0; - -protected: - virtual ~Observer() {} -}; - -} // namespace openmsx - -#endif Deleted: openmsx/trunk/src/ScopedAssign.hh =================================================================== --- openmsx/trunk/src/ScopedAssign.hh 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/ScopedAssign.hh 2007-06-27 14:31:15 UTC (rev 6672) @@ -1,27 +0,0 @@ -// $Id$ - -#ifndef SCOPEDASSIGN_HH -#define SCOPEDASSIGN_HH - -/** Assign new value to some variable and restore the original value - * when this object goes out of scope. - */ -template <typename T> class ScopedAssign -{ -public: - ScopedAssign(T& var_, T newValue) - : var(var_) - { - oldValue = var; - var = newValue; - } - ~ScopedAssign() - { - var = oldValue; - } -private: - T& var; - T oldValue; -}; - -#endif Deleted: openmsx/trunk/src/StringOp.cc =================================================================== --- openmsx/trunk/src/StringOp.cc 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/StringOp.cc 2007-06-27 14:31:15 UTC (rev 6672) @@ -1,111 +0,0 @@ -//$Id$ - -#include <cstdlib> -#include <algorithm> -#include "StringOp.hh" - -using std::advance; -using std::equal; -using std::string; -using std::transform; -using std::vector; - -namespace openmsx { - -namespace StringOp { - -int stringToInt(const string& str) -{ - return strtol(str.c_str(), NULL, 0); -} - -uint64 stringToUint64(const string& str) -{ - return strtoull(str.c_str(), NULL, 0); -} - -bool stringToBool(const string& str) -{ - string low = StringOp::toLower(str); - return (low == "true") || (low == "yes") || (low == "1"); -} - -double stringToDouble(const string& str) -{ - return strtod(str.c_str(), NULL); -} - -string toLower(const string& str) -{ - string result = str; - transform(result.begin(), result.end(), result.begin(), ::tolower); - return result; -} - -bool startsWith(const string& total, const string& part) -{ - if (total.size() < part.size()) return false; - return equal(part.begin(), part.end(), total.begin()); -} - -bool endsWith(const string& total, const string& part) -{ - int offset = total.size() - part.size(); - if (offset < 0) return false; - return equal(part.begin(), part.end(), total.begin() + offset); -} - -void trimRight(string& str, const string& chars) -{ - string::size_type pos = str.find_last_not_of(chars); - if (pos != string::npos) { - str.erase(pos + 1); - } else { - str.clear(); - } -} - -void trimLeft (string& str, const string& chars) -{ - str.erase(0, str.find_first_not_of(chars)); -} - -void splitOnFirst(const string& str, const string& chars, string& first, string& last) -{ - std::string::size_type pos = str.find_first_of(chars); - if (pos == std::string::npos) { - first = str; - last.clear(); - } else { - first = str.substr(0, pos); - last = str.substr(pos + 1); - } -} - -void splitOnLast(const string& str, const string& chars, string& first, string& last) -{ - std::string::size_type pos = str.find_last_of(chars); - if (pos == std::string::npos) { - first.clear(); - last = str; - } else { - first = str.substr(0, pos); - last = str.substr(pos + 1); - } -} - -void split(const string& str, const string& chars, vector<string>& result) -{ - // can be implemented more efficiently if needed - string tmp = str; - while (!tmp.empty()) { - string first, last; - splitOnFirst(tmp, chars, first, last); - result.push_back(first); - tmp = last; - } -} - -} // namespace StringOp - -} // namespace openmsx Deleted: openmsx/trunk/src/StringOp.hh =================================================================== --- openmsx/trunk/src/StringOp.hh 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/StringOp.hh 2007-06-27 14:31:15 UTC (rev 6672) @@ -1,61 +0,0 @@ -// $Id$ - -#ifndef STRINGOP_HH -#define STRINGOP_HH - -#include "openmsx.hh" -#include <string> -#include <vector> -#include <sstream> -#include <strings.h> -#include <iomanip> - -namespace openmsx { - -namespace StringOp -{ - template <typename T> std::string toString(const T& t) - { - std::ostringstream s; - s << t; - return s.str(); - } - - template <typename T> std::string toHexString(const T& t, int width) - { - std::ostringstream s; - s << std::hex << std::setw(width) << std::setfill('0') << t; - return s.str(); - } - - int stringToInt(const std::string& str); - uint64 stringToUint64(const std::string& str); - bool stringToBool(const std::string& str); - double stringToDouble(const std::string& str); - - std::string toLower(const std::string& str); - - bool startsWith(const std::string& total, const std::string& part); - bool endsWith (const std::string& total, const std::string& part); - - void trimRight(std::string& str, const std::string& chars); - void trimLeft (std::string& str, const std::string& chars); - - void splitOnFirst(const std::string& str, const std::string& chars, - std::string& first, std::string& last); - void splitOnLast (const std::string& str, const std::string& chars, - std::string& first, std::string& last); - void split(const std::string& str, const std::string& chars, - std::vector<std::string>& result); - - // case insensitive less then operator - struct caseless { - bool operator()(const std::string& s1, const std::string& s2) const { - return strcasecmp(s1.c_str(), s2.c_str()) < 0; - } - }; -} - -} // namespace openmsx - -#endif Deleted: openmsx/trunk/src/Subject.hh =================================================================== --- openmsx/trunk/src/Subject.hh 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/Subject.hh 2007-06-27 14:31:15 UTC (rev 6672) @@ -1,83 +0,0 @@ -// $Id$ - -#ifndef SUBJECT_HH -#define SUBJECT_HH - -#include "Observer.hh" -#include <algorithm> -#include <vector> -#include <cassert> - -namespace openmsx { - -/** - * Generic Gang-of-Four Subject class of the Observer pattern, templatized - * edition. - */ -template <typename T> class Subject -{ -public: - void attach(Observer<T>& observer); - void detach(Observer<T>& observer); - -protected: - Subject(); - ~Subject(); - void notify() const; - -private: - typedef std::vector<Observer<T>*> Observers; - Observers observers; -#ifndef NDEBUG - mutable bool notifyInProgress; -#endif -}; - -template <typename T> Subject<T>::Subject() -#ifndef NDEBUG - : notifyInProgress(false) -#endif -{ -} - -template <typename T> Subject<T>::~Subject() -{ - assert(!notifyInProgress); - assert(observers.empty()); -} - -template <typename T> void Subject<T>::attach(Observer<T>& observer) -{ - assert(!notifyInProgress); - observers.push_back(&observer); -} - -template <typename T> void Subject<T>::detach(Observer<T>& observer) -{ - assert(!notifyInProgress); - typename Observers::iterator it = - find(observers.begin(), observers.end(), &observer); - assert(it != observers.end()); - observers.erase(it); -} - -template <typename T> void Subject<T>::notify() const -{ -#ifndef NDEBUG - assert(!notifyInProgress); - notifyInProgress = true; -#endif - - for (typename Observers::const_iterator it = observers.begin(); - it != observers.end(); ++it) { - (*it)->update(*static_cast<const T*>(this)); - } - -#ifndef NDEBUG - notifyInProgress = false; -#endif -} - -} - -#endif Deleted: openmsx/trunk/src/Unicode.cc =================================================================== --- openmsx/trunk/src/Unicode.cc 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/Unicode.cc 2007-06-27 14:31:15 UTC (rev 6672) @@ -1,91 +0,0 @@ -//$Id$ - -#include "Unicode.hh" -#include <iostream> - -using std::string; - -namespace openmsx { - -namespace Unicode { - -/* decodes a a string possibly containing UTF-8 sequences to a - * string of 8-bit characters. - * characters >= 0x100 are mapped to '?' for now - * this implementation follows the guidelines in - * http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt - * except for the following: - * - the two byte seqence 0xC0 0x80 for '\0' is allowed - * - surrogates are ignored - * - * - * TODO: catch surrogates - * TODO: respond to malformed sequences in a more appropriate way - */ - -static void bad_utf(const string& msg) -{ - std::cerr << "Error in UTF-8 encoding: " << msg << std::endl; -} - -string utf8ToAscii(const string& utf8) -{ - string res; - - for (string::const_iterator it = utf8.begin(); it != utf8.end(); /* */) { - char first = *it++; - switch (first & 0xC0) { - case 0x80: - bad_utf("unexpected continuation byte"); - res.push_back('?'); - break; - case 0xC0: - char nbyte, mask; - unsigned uni; - for (mask = 0x20, first -= 0xC0, nbyte = 2; - first & mask; - mask >>= 1, ++nbyte) { - first -= mask; - } - if (nbyte > 6) { - bad_utf("illegal byte"); - uni = 0xFFFD; - nbyte = 0; - } else { - char i; - for (i = 1, uni = first; i < nbyte; ++i) { - if ((it == utf8.end()) || - ((*it & 0xC0) != 0x80)) { - bad_utf("incomplete sequence"); - uni = 0xFFFD; - break; - } else { - uni = (uni << 6) + (*it++ & 0x3F); - } - } - // check for overlong sequences - if ((i == nbyte) && - (uni < (1u << (5 * nbyte - (nbyte == 2 ? 3 : 4))))) { - if ((uni != 0) || (nbyte != 2)) { - // 2 bytes is acceptable for '\0' - bad_utf("overlong sequence"); - uni = 0xFFFD; - } - } - if ((uni == 0xFFFE) || (uni == 0xFFFF)) { - bad_utf("illegal code"); - } - } - res.push_back((uni > 0x100) ? '?' : char(uni)); - break; - default: - res.push_back(first); - break; - } - } - return res; -} - -} // namespace Unicode - -} // namespace openmsx Deleted: openmsx/trunk/src/Unicode.hh =================================================================== --- openmsx/trunk/src/Unicode.hh 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/Unicode.hh 2007-06-27 14:31:15 UTC (rev 6672) @@ -1,20 +0,0 @@ -// $Id$ - -#ifndef UNICODE_HH -#define UNICODE_HH - -#include <string> - -namespace openmsx { - -namespace Unicode -{ - //decodes a a string possibly containing UTF-8 sequences to a - //string of 8-bit characters. - // characters >= 0x100 are mapped to '?' for now - std::string utf8ToAscii(const std::string& utf8); -} - -} // namespace openmsx - -#endif Deleted: openmsx/trunk/src/checked_cast.hh =================================================================== --- openmsx/trunk/src/checked_cast.hh 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/checked_cast.hh 2007-06-27 14:31:15 UTC (rev 6672) @@ -1,65 +0,0 @@ -// $Id$ - -#ifndef CHECKED_CAST_HH -#define CHECKED_CAST_HH - -/** - * Based on checked_cast implementation from the book: - * C++ Coding Standard - * item 93: Avoid using static_cast on pointers - */ - -#include <cassert> - -/* IMHO this implementation is simpler, but gcc-3.4 and below don't - * correctly handle overloading with it (ambiguous overload). - * - * template<typename T> struct remove_reference - * { - * typedef T type; - * }; - * template<typename T> struct remove_reference<T&> - * { - * typedef T type; - * }; - * - * template<typename TO, typename FROM> - * static TO checked_cast(FROM* from) - * { - * assert(dynamic_cast<TO>(from) == static_cast<TO>(from)); - * return static_cast<TO>(from); - * } - * template<typename TO, typename FROM> - * static TO checked_cast(FROM& from) - * { - * typedef typename remove_reference<TO>::type* TO_PTR; - * assert(dynamic_cast<TO_PTR>(&from) == static_cast<TO_PTR>(&from)); - * return static_cast<TO>(from); - * } - * - * Implementation below can only handle const references, need to find a way - * around that. - */ -template<typename TO, typename FROM> struct checked_cast_impl {}; -template<typename TO, typename FROM> struct checked_cast_impl<TO*, FROM> -{ - inline TO* operator()(FROM from) { - assert(dynamic_cast<TO*>(from) == static_cast<TO*>(from)); - return static_cast<TO*>(from); - } -}; -template<typename TO, typename FROM> struct checked_cast_impl<TO&, FROM> -{ - inline TO& operator()(const FROM& from) { - assert(dynamic_cast<TO*>(&from) == static_cast<TO*>(&from)); - return static_cast<TO&>(from); - } -}; -template<typename TO, typename FROM> -static inline TO checked_cast(const FROM& from) -{ - checked_cast_impl<TO, FROM> caster; - return caster(from); -} - -#endif Deleted: openmsx/trunk/src/fdc/CRC16.cc =================================================================== --- openmsx/trunk/src/fdc/CRC16.cc 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/fdc/CRC16.cc 2007-06-27 14:31:15 UTC (rev 6672) @@ -1,63 +0,0 @@ -// $Id$ - -#include "CRC16.hh" - - -namespace openmsx { - -// Accelerator table to compute the CRC eight bits at a time - -const word CRC16::CRC16Table[256] = { - 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, - 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, - 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, - 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, - 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, - 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, - 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, - 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, - 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, - 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, - 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, - 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, - 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, - 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, - 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, - 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, - 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, - 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, - 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, - 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, - 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, - 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, - 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, - 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, - 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, - 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, - 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, - 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, - 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, - 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, - 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, - 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0, -}; - -} // namespace openmsx - -#if 0 -using openmsx::CRC16; -int main(int argc, char** argv) -{ - CRC16 crc1; - assert(crc1.getValue() == 0xFFFF); - crc1.update(0xA1); - crc1.update(0xA1); - crc1.update(0xA1); - assert(crc1.getValue() == 0xCDB4); - - CRC16 crc2; - byte test[3] = { 0xA1, 0xA1, 0xA1 }; - crc2.update(test, 3); - assert(crc2.getValue() == 0xCDB4); -} -#endif Deleted: openmsx/trunk/src/fdc/CRC16.hh =================================================================== --- openmsx/trunk/src/fdc/CRC16.hh 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/fdc/CRC16.hh 2007-06-27 14:31:15 UTC (rev 6672) @@ -1,54 +0,0 @@ -// $Id$ - -#ifndef CRC16_HH -#define CRC16_HH - -#include "openmsx.hh" - -namespace openmsx { - -/** - * This class calculates CRC numbers for the polygon - * x^16 + x^12 + x^5 + 1 - */ -class CRC16 -{ -public: - /** Create CRC16 with an optional initial value - */ - explicit CRC16(word initialCRC = 0xFFFF) - { - crc = initialCRC; - } - - /** Update CRC with one byte - */ - void update(byte value) - { - crc = (crc << 8) ^ CRC16Table[(crc >> 8) ^ value]; - } - - /** Update CRC with a buffer of bytes - */ - void update(byte* values, int num) - { - while (num--) { - update(*values++); - } - } - - /** Get current CRC value - */ - word getValue() - { - return crc; - } - -private: - word crc; - static const word CRC16Table[256]; -}; - -} // namespace openmsx - -#endif Modified: openmsx/trunk/src/fdc/node.mk =================================================================== --- openmsx/trunk/src/fdc/node.mk 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/fdc/node.mk 2007-06-27 14:31:15 UTC (rev 6672) @@ -21,7 +21,6 @@ DummyDisk \ DSKDiskImage \ XSADiskImage \ - CRC16 \ DirAsDSK \ EmptyDiskPatch \ RamDSKDiskImage \ Deleted: openmsx/trunk/src/file/Date.cc =================================================================== --- openmsx/trunk/src/file/Date.cc 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/file/Date.cc 2007-06-27 14:31:15 UTC (rev 6672) @@ -1,71 +0,0 @@ -// $Id$ - -#include "Date.hh" -#include <sstream> -#include <iomanip> -#include <cstdio> -#include <cstring> - -namespace openmsx { - -namespace Date { - -const char* const days[7] = { - "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ,"Sun" -}; - -const char* const months[12] = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" -}; - -time_t fromString(const std::string& line) -{ - char day[4]; - char month[4]; - struct tm tm; - int items = sscanf(line.c_str(), "%3s %3s %2d %2d:%2d:%2d %4d", - day, month, &tm.tm_mday, &tm.tm_hour, - &tm.tm_min, &tm.tm_sec, &tm.tm_year); - tm.tm_year -= 1900; - tm.tm_isdst = -1; - tm.tm_mon = -1; - if ((tm.tm_sec < 0) || (59 < tm.tm_sec) || - (tm.tm_min < 0) || (59 < tm.tm_min) || - (tm.tm_hour < 0) || (23 < tm.tm_hour) || - (tm.tm_mday < 1) || (31 < tm.tm_mday) || - (tm.tm_year < 0)) { - return static_cast<time_t>(-1); - } - for (int i = 0; i < 12; ++i) { - if (strcmp(month, months[i]) == 0) { - tm.tm_mon = i; - break; - } - } - if ((items != 7) || (tm.tm_mon == -1)) { - return static_cast<time_t>(-1); - } - return mktime(&tm); -} - -std::string toString(time_t time) -{ - if (time < 0) time = 0; - struct tm* tm; - tm = localtime(&time); - std::ostringstream sstr; - sstr << std::setfill('0') - << days[tm->tm_wday] << " " - << months[tm->tm_mon] << " " - << std::setw(2) << tm->tm_mday << " " - << std::setw(2) << tm->tm_hour << ":" - << std::setw(2) << tm->tm_min << ":" - << std::setw(2) << tm->tm_sec << " " - << std::setw(4) << (tm->tm_year + 1900); - return sstr.str(); -} - -} // namespace Date - -} // namespace openmsx Deleted: openmsx/trunk/src/file/Date.hh =================================================================== --- openmsx/trunk/src/file/Date.hh 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/file/Date.hh 2007-06-27 14:31:15 UTC (rev 6672) @@ -1,20 +0,0 @@ -// $Id$ - -#ifndef DATE_HH -#define DATE_HH - -#include <string> -#include <time.h> - -namespace openmsx { - -namespace Date { - - time_t fromString(const std::string& line); - std::string toString(time_t time); - -} // namespace Date - -} // namespace openmsx - -#endif Modified: openmsx/trunk/src/file/node.mk =================================================================== --- openmsx/trunk/src/file/node.mk 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/file/node.mk 2007-06-27 14:31:15 UTC (rev 6672) @@ -13,7 +13,6 @@ ZipFileAdapter \ ReadDir \ FilePool \ - Date \ PreCacheFile HDR_ONLY:= \ Deleted: openmsx/trunk/src/likely.hh =================================================================== --- openmsx/trunk/src/likely.hh 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/likely.hh 2007-06-27 14:31:15 UTC (rev 6672) @@ -1,20 +0,0 @@ -// $Id$ - -#ifndef LIKELY_HH -#define LIKELY_HH - -/* Somewhere in the middle of the GCC 2.96 development cycle, we implemented - * a mechanism by which the user can annotate likely branch directions and - * expect the blocks to be reordered appropriately. Define __builtin_expect - * to nothing for earlier compilers. - */ - -#if __GNUC__ > 2 -#define likely(x) __builtin_expect((x),1) -#define unlikely(x) __builtin_expect((x),0) -#else -#define likely(x) (x) -#define unlikely(x) (x) -#endif - -#endif Modified: openmsx/trunk/src/node.mk =================================================================== --- openmsx/trunk/src/node.mk 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/node.mk 2007-06-27 14:31:15 UTC (rev 6672) @@ -4,7 +4,7 @@ SUBDIRS:= \ cassette commands config console cpu debugger events fdc file ide \ - input memory resource serial settings sound thread video + input memory resource serial settings sound thread utils video SRC_HDR:= \ EmuTime EmuDuration \ @@ -33,28 +33,20 @@ FirmwareSwitch \ CommandLineParser CLIOption \ CliExtension \ - Math sha1 \ - CircularBuffer \ PluggingController Connector Pluggable PluggableFactory \ DebugDevice \ Autofire RenShaTurbo \ - StringOp \ - Unicode \ EmptyPatch IPSPatch \ - Version \ - HostCPU + Version SRC_ONLY:= \ main HDR_ONLY:= \ - Subject Observer \ openmsx \ - likely noncopyable shared_ptr checked_cast ScopedAssign \ Clock DynamicClock \ MSXException InitException \ - PatchInterface \ - FixedPoint + PatchInterface DIST:= \ Doxyfile Deleted: openmsx/trunk/src/noncopyable.hh =================================================================== --- openmsx/trunk/src/noncopyable.hh 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/noncopyable.hh 2007-06-27 14:31:15 UTC (rev 6672) @@ -1,24 +0,0 @@ -// $Id$ - -#ifndef NONCOPYABLE_HH -#define NONCOPYABLE_HH - -/** - * Based on boost::noncopyable, see boost documentation: - * http://www.boost.org/libs/utility - * - * Summary: - * Class noncopyable is a base class. Derive your own class from noncopyable - * when you want to prohibit copy construction and copy assignment. - */ -class noncopyable -{ -protected: - noncopyable() {} - ~noncopyable() {} -private: - noncopyable(const noncopyable&); - const noncopyable& operator=(const noncopyable&); -}; - -#endif Deleted: openmsx/trunk/src/sha1.cc =================================================================== --- openmsx/trunk/src/sha1.cc 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/sha1.cc 2007-06-27 14:31:15 UTC (rev 6672) @@ -1,209 +0,0 @@ -// $Id$ - -/* -Based on: -100% free public domain implementation of the SHA-1 algorithm -by Dominik Reichl <Dom...@ti...> - -Refactored in C++ style as part of openMSX -by Maarten ter Huurne and Wouter Vermaelen. - -=== Test Vectors (from FIPS PUB 180-1) === - -"abc" -A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D - -"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" -84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 - -A million repetitions of "a" -34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F -*/ - -#include "sha1.hh" -#include "build-info.hh" -#include <cassert> -#include <cstdio> -#include <memory.h> - -using std::string; - -namespace openmsx { - -// Rotate x bits to the left -inline static uint32 rol32(uint32 value, int bits) -{ - return (value << bits) | (value >> (32 - bits)); -} - -class WorkspaceBlock { -private: - uint32 data[16]; - - uint32 next0(int i) - { - if (OPENMSX_BIGENDIAN) { - return data[i]; - } else { - return data[i] = (rol32(data[i], 24) & 0xFF00FF00) - | (rol32(data[i], 8) & 0x00FF00FF); - } - } - uint32 next(int i) - { - return data[i & 15] = rol32( - data[(i + 13) & 15] ^ data[(i + 8) & 15] ^ - data[(i + 2) & 15] ^ data[ i & 15] - , 1); - } - -public: - explicit WorkspaceBlock(const byte buffer[64]); - - // SHA-1 rounds - void r0(uint32 v, uint32& w, uint32 x, uint32 y, uint32& z, int i) - { - z += ((w & (x ^ y)) ^ y) + next0(i) + 0x5A827999 + rol32(v, 5); - w = rol32(w, 30); - } - void r1(uint32 v, uint32& w, uint32 x, uint32 y, uint32& z, int i) - { - z += ((w & (x ^ y)) ^ y) + next(i) + 0x5A827999 + rol32(v, 5); - w = rol32(w, 30); - } - void r2(uint32 v, uint32& w, uint32 x, uint32 y, uint32& z, int i) - { - z += (w ^ x ^ y) + next(i) + 0x6ED9EBA1 + rol32(v, 5); - w = rol32(w, 30); - } - void r3(uint32 v, uint32& w, uint32 x, uint32 y, uint32& z, int i) - { - z += (((w | x) & y) | (w & x)) + next(i) + 0x8F1BBCDC + rol32(v, 5); - w = rol32(w, 30); - } - void r4(uint32 v, uint32& w, uint32 x, uint32 y, uint32& z, int i) - { - z += (w ^ x ^ y) + next(i) + 0xCA62C1D6 + rol32(v, 5); - w = rol32(w, 30); - } -}; - -WorkspaceBlock::WorkspaceBlock(const byte buffer[64]) -{ - memcpy(data, buffer, 64); -} - - -SHA1::SHA1() -{ - // SHA1 initialization constants - m_state[0] = 0x67452301; - m_state[1] = 0xEFCDAB89; - m_state[2] = 0x98BADCFE; - m_state[3] = 0x10325476; - m_state[4] = 0xC3D2E1F0; - - m_count = 0; -} - -void SHA1::transform(const byte buffer[64]) -{ - WorkspaceBlock block(buffer); - - // Copy m_state[] to working vars - uint32 a = m_state[0]; - uint32 b = m_state[1]; - uint32 c = m_state[2]; - uint32 d = m_state[3]; - uint32 e = m_state[4]; - - // 4 rounds of 20 operations each. Loop unrolled - block.r0(a,b,c,d,e, 0); block.r0(e,a,b,c,d, 1); block.r0(d,e,a,b,c, 2); - block.r0(c,d,e,a,b, 3); block.r0(b,c,d,e,a, 4); block.r0(a,b,c,d,e, 5); - block.r0(e,a,b,c,d, 6); block.r0(d,e,a,b,c, 7); block.r0(c,d,e,a,b, 8); - block.r0(b,c,d,e,a, 9); block.r0(a,b,c,d,e,10); block.r0(e,a,b,c,d,11); - block.r0(d,e,a,b,c,12); block.r0(c,d,e,a,b,13); block.r0(b,c,d,e,a,14); - block.r0(a,b,c,d,e,15); block.r1(e,a,b,c,d,16); block.r1(d,e,a,b,c,17); - block.r1(c,d,e,a,b,18); block.r1(b,c,d,e,a,19); block.r2(a,b,c,d,e,20); - block.r2(e,a,b,c,d,21); block.r2(d,e,a,b,c,22); block.r2(c,d,e,a,b,23); - block.r2(b,c,d,e,a,24); block.r2(a,b,c,d,e,25); block.r2(e,a,b,c,d,26); - block.r2(d,e,a,b,c,27); block.r2(c,d,e,a,b,28); block.r2(b,c,d,e,a,29); - block.r2(a,b,c,d,e,30); block.r2(e,a,b,c,d,31); block.r2(d,e,a,b,c,32); - block.r2(c,d,e,a,b,33); block.r2(b,c,d,e,a,34); block.r2(a,b,c,d,e,35); - block.r2(e,a,b,c,d,36); block.r2(d,e,a,b,c,37); block.r2(c,d,e,a,b,38); - block.r2(b,c,d,e,a,39); block.r3(a,b,c,d,e,40); block.r3(e,a,b,c,d,41); - block.r3(d,e,a,b,c,42); block.r3(c,d,e,a,b,43); block.r3(b,c,d,e,a,44); - block.r3(a,b,c,d,e,45); block.r3(e,a,b,c,d,46); block.r3(d,e,a,b,c,47); - block.r3(c,d,e,a,b,48); block.r3(b,c,d,e,a,49); block.r3(a,b,c,d,e,50); - block.r3(e,a,b,c,d,51); block.r3(d,e,a,b,c,52); block.r3(c,d,e,a,b,53); - block.r3(b,c,d,e,a,54); block.r3(a,b,c,d,e,55); block.r3(e,a,b,c,d,56); - block.r3(d,e,a,b,c,57); block.r3(c,d,e,a,b,58); block.r3(b,c,d,e,a,59); - block.r4(a,b,c,d,e,60); block.r4(e,a,b,c,d,61); block.r4(d,e,a,b,c,62); - block.r4(c,d,e,a,b,63); block.r4(b,c,d,e,a,64); block.r4(a,b,c,d,e,65); - block.r4(e,a,b,c,d,66); block.r4(d,e,a,b,c,67); block.r4(c,d,e,a,b,68); - block.r4(b,c,d,e,a,69); block.r4(a,b,c,d,e,70); block.r4(e,a,b,c,d,71); - block.r4(d,e,a,b,c,72); block.r4(c,d,e,a,b,73); block.r4(b,c,d,e,a,74); - block.r4(a,b,c,d,e,75); block.r4(e,a,b,c,d,76); block.r4(d,e,a,b,c,77); - block.r4(c,d,e,a,b,78); block.r4(b,c,d,e,a,79); - - // Add the working vars back into m_state[] - m_state[0] += a; - m_state[1] += b; - m_state[2] += c; - m_state[3] += d; - m_state[4] += e; -} - -// Use this function to hash in binary data and strings -void SHA1::update(const byte* data, unsigned len) -{ - assert(digest.empty()); - uint32 j = (m_count >> 3) & 63; - - m_count += len << 3; - - uint32 i; - if ((j + len) > 63) { - memcpy(&m_buffer[j], data, (i = 64 - j)); - transform(m_buffer); - for (; i + 63 < len; i += 64) { - transform(&data[i]); - } - j = 0; - } else { - i = 0; - } - memcpy(&m_buffer[j], &data[i], len - i); -} - -void SHA1::finalize() -{ - byte finalcount[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; - for (int i = 0; i < 8; i++) { - finalcount[i] = static_cast<byte>(m_count >> ((7 - i) * 8)); - } - - update((const byte*)"\200", 1); - while ((m_count & 504) != 448) { - update((const byte*)"\0", 1); - } - update(finalcount, 8); // cause a transform() - - char s[41]; - for (int i = 0; i < 20; ++i) { - sprintf(s + i * 2, "%02x", static_cast<byte>( - m_state[i >> 2] >> ((3 - (i & 3)) * 8))); - } - digest = string(s, 40); -} - -const string& SHA1::hex_digest() -{ - if (digest.empty()) { - finalize(); - } - assert(!digest.empty()); - return digest; -} - -} // namespace openmsx Deleted: openmsx/trunk/src/sha1.hh =================================================================== --- openmsx/trunk/src/sha1.hh 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/sha1.hh 2007-06-27 14:31:15 UTC (rev 6672) @@ -1,38 +0,0 @@ -// $Id$ - -#ifndef SHA1_HH -#define SHA1_HH - -#include "openmsx.hh" -#include <string> - -namespace openmsx { - -class SHA1 -{ -public: - SHA1(); - - /** Update the hash value. - */ - void update(const byte* data, unsigned len); - - /** Get the final hash as a pre-formatted string. - * After this method is called, calls to update() are invalid. - */ - const std::string& hex_digest(); - -private: - void transform(const byte buffer[64]); - void finalize(); - - uint32 m_state[5]; - uint64 m_count; - byte m_buffer[64]; - - std::string digest; -}; - -} // namespace openmsx - -#endif Deleted: openmsx/trunk/src/shared_ptr.hh =================================================================== --- openmsx/trunk/src/shared_ptr.hh 2007-06-27 08:05:38 UTC (rev 6671) +++ openmsx/trunk/src/shared_ptr.hh 2007-06-27 14:31:15 UTC (rev 6672) @@ -1,72 +0,0 @@ -// $Id$ - -#ifndef SHARED_PTR_HH -#define SHARED_PTR_HH - -/** - * Based on boost::shared_ptr - * http://www.boost.org/libs/smart_ptr/shared_ptr.htm - * The boost version is more complete and faster but at the - * moment we don't care about that. - */ - -#include <algorithm> -#include <cassert> - -template<typename T> class shared_ptr -{ -public: - explicit shared_ptr(T* p = 0) - : ptr(p), count(new unsigned(1)) {} - - shared_ptr(const shared_ptr<T>& other) - : ptr(other.ptr), count(other.count) - { - ++(*count); - } - - ~shared_ptr() - { - if (--(*count) == 0) { - delete ptr; - delete count; - } - } - - void swap(shared_ptr<T>& other) - { - std::swap(ptr, other.ptr); - std::swap(count, other.count); - } - - shared_ptr& operator=(shared_ptr other) // note: pass by value - { swap(other); return *this; } - void reset(T* t = 0) - { shared_ptr<T>(t).swap(*this); } - - T& operator* () const { assert(ptr); return *ptr; } - T* operator->() const { assert(ptr); return ptr; } - T* get() const { return ptr; } - -private: - T* ptr; - unsigned* count; -}; - -template<typename T, typename U> -bool operator==(const shared_ptr<T>& lhs, const shared_ptr<U>& rhs) -{ - return lhs.get() == rhs.get(); -} -template<typename T, typename U> -bool operator!=(const shared_ptr<T>& lhs, const shared_ptr<U>& rhs) -{ - return lhs.get() != rhs.get(); -} -template<typename T, typename U> -bool operator<(const shared_ptr<T>& lhs, const shared_ptr<U>& rhs) -{ - return lhs.get() < rhs.get(); -} - -#endif Copied: openmsx/trunk/src/utils/CRC16.cc (from rev 6671, openmsx/trunk/src/fdc/CRC16.cc) =================================================================== --- openmsx/trunk/src/utils/CRC16.cc (rev 0) +++ openmsx/trunk/src/utils/CRC16.cc 2007-06-27 14:31:15 UTC (rev 6672) @@ -0,0 +1,63 @@ +// $Id$ + +#include "CRC16.hh" + + +namespace openmsx { + +// Accelerator table to compute the CRC eight bits at a time + +const word CRC16::CRC16Table[256] = { + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, + 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, + 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, + 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, + 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, + 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, + 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, + 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, + 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, + 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, + 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, + 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, + 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, + 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, + 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, + 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, + 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, + 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, + 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, + 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, + 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, + 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, + 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, + 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0, +}; + +} // namespace openmsx + +#if 0 +using openmsx::CRC16; +int main(int argc, char** argv) +{ + CRC16 crc1; + assert(crc1.getValue() == 0xFFFF); + crc1.update(0xA1); + crc1.update(0xA1); + crc1.update(0xA1); + assert(crc1.getValue() == 0xCDB4); + + CRC16 crc2; + byte test[3] = { 0xA1, 0xA1, 0xA1 }; + crc2.update(test, 3); + assert(crc2.getValue() == 0xCDB4); +} +#endif Copied: openmsx/trunk/src/utils/CRC16.hh (from rev 6671, openmsx/trunk/src/fdc/CRC16.hh) =================================================================== --- openmsx/trunk/src/utils/CRC16.hh (rev 0) +++ openmsx/trunk/src/utils/CRC16.hh 2007-06-27 14:31:15 UTC (rev 6672) @@ -0,0 +1,54 @@ +// $Id$ + +#ifndef CRC16_HH +#define CRC16_HH + +#include "openmsx.hh" + +namespace openmsx { + +/** + * This class calculates CRC numbers for the polygon + * x^16 + x^12 + x^5 + 1 + */ +class CRC16 +{ +public: + /** Create CRC16 with an optional initial value + */ + explicit CRC16(word initialCRC = 0xFFFF) + { + crc = initialCRC; + } + + /** Update CRC with one byte + */ + void update(byte value) + { + crc = (crc << 8) ^ CRC16Table[(crc >> 8) ^ value]; + } + + /** Update CRC with a buffer of bytes + */ + void update(byte* values, int num) + { + while (num--) { + update(*values++); + } + } + + /** Get current CRC value + */ + word getValue() + { + return crc; + } + +private: + word crc; + static const word CRC16Table[256]; +}; + +} // namespace openmsx + +#endif Copied: openmsx/trunk/src/utils/CircularBuffer.cc (from rev 6671, openmsx/trunk/src/CircularBuffer.cc) =================================================================== --- openmsx/trunk/src/utils/CircularBuffer.cc (rev 0) +++ openmsx/trunk/src/utils/CircularBuffer.cc 2007-06-27 14:31:15 UTC (rev 6672) @@ -0,0 +1,50 @@ +// $Id$ + +#if 0 + +#include "CircularBuffer.hh" +#include <iostream> + +int main() +{ + openmsx::CircularBuffer<int, 2> buf; + assert(buf.isEmpty()); + assert(!buf.isFull()); + assert(buf.size() == 0); + + buf.addBack(15); + assert(!buf.isEmpty()); + assert(!buf.isFull()); + assert(buf.size() == 1); + assert(buf[0] == 15); + + buf[0] = 25; + assert(buf[0] == 25); + + buf.addFront(17); + assert(!buf.isEmpty()); + assert(buf.isFull()); + assert(buf.size() == 2); + assert(buf[0] == 17); + assert(buf[1] == 25); + + buf[1] = 35; + assert(buf[0] == 17); + assert(buf[1] == 35); + buf[0] = 27; + assert(buf[0] == 27); + assert(buf[1] == 35); + + int a = buf.removeBack(); + assert(a == 35); + assert(buf.size() == 1); + assert(buf[0] == 27); + + int b = buf.removeFront(); + assert(b == 27); + assert(buf.isEmpty()); + + std::cout << "Test passed!" << std::endl; +} + +#endif Copied: openmsx/trunk/src/utils/CircularBuffer.hh (from rev 6671, openmsx/trunk/src/CircularBuffer.hh) =================================================================== --- openmsx/trunk/src/utils/CircularBuffer.hh (rev 0) +++ openmsx/trunk/src/utils/CircularBuffer.hh 2007-06-27 14:31:15 UTC (rev 6672) @@ -0,0 +1,79 @@ +// $Id$ + +#ifndef CIRCULARBUFFER_HH +#define CIRCULARBUFFER_HH + +#include <cassert> + +namespace openmsx { + +template<class T, unsigned MAXSIZE> +class CircularBuffer +{ +public: + CircularBuffer() + : first(0), last(0) + { + } + void addFront(const T& element) { + assert(!isFull()); + first = prev(first); + buffer[first] = element; + } + void addBack(const T& element) { + assert(!isFull()); + buffer[last] = element; + last = next(last); + } + T& removeFront() { + assert(!isEmpty()); + unsigned tmp = first; + first = next(first); + return buffer[tmp]; + } + T& removeBack() { + assert(!isEmpty()); + last = prev(last); + return buffer[last]; + } + T& operator[](unsigned pos) { + assert(pos < MAXSIZE); + unsigned tmp = first + pos; + if (tmp > MAXSIZE) { + tmp -= (MAXSIZE + 1); + } + return buffer[tmp]; + } + const T& operator[](unsigned pos) const { + return const_cast<CircularBuffer&>(*this)[pos]; + } + bool isEmpty() const { + return (first == last); + } + bool isFull() const { + return (first == next(last)); + } + unsigned size() const { + if (first > last) { + return MAXSIZE + 1 - first + last; + } else { + return last - first; + } + } + +private: + inline unsigned next(unsigned a) const { + return (a != MAXSIZE) ? a + 1 : 0; + } + inline unsigned prev(unsigned a) const { + return (a != 0) ? a - 1 : MAXSIZE; + } + + unsigned first, last; + // one extra to be able to distinguish full and empty + T buffer[MAXSIZE + 1]; +}; + +} // namespace openmsx + +#endif Copied: openmsx/trunk/src/utils/Date.cc (from rev 6671, openmsx/trunk/src/file/Date.cc) =================================================================== --- openmsx/trunk/src/utils/Date.cc (rev 0) +++ openmsx/trunk/src/utils/Date.cc 2007-06-27 14:31:15 UTC (rev 6672) @@ -0,0 +1,71 @@ +// $Id$ + +#include "Date.hh" +#include <sstream> +#include <iomanip> +#include <cstdio> +#include <cstring> + +namespace openmsx { + +namespace Date { + +const char* const days[7] = { + "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ,"Sun" +}; + +const char* const months[12] = { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" +}; + +time_t fromString(const std::string& line) +{ + char day[4]; + char month[4]; + struct tm tm; + int items = sscanf(line.c_str(), "%3s %3s %2d %2d:%2d:%2d %4d", + day, month, &tm.tm_mday, &tm.tm_hour, + &tm.tm_min, &tm.tm_sec, &tm.tm_year); + tm.tm_year -= 1900; + tm.tm_isdst = -1; + tm.tm_mon = -1; + if ((tm.tm_sec < 0) || (59 < tm.tm_sec) || + (tm.tm_min < 0) || (59 < tm.tm_min) || + (tm.tm_hour < 0) || (23 < tm.tm_hour) || + (tm.tm_mday < 1) || (31 < tm.tm_mday) || + (tm.tm_year < 0)) { + return static_cast<time_t>(-1); + } + for (int i = 0; i < 12; ++i) { + if (strcmp(month, months[i]) == 0) { + tm.tm_mon = i; + break; + } + } + if ((items != 7) || (tm.tm_mon == -1)) { + return static_cast<time_t>(-1); + } + return mktime(&tm); +} + +std::string toString(time_t time) +{ + if (time < 0) time = 0; + struct tm* tm; + tm = localtime(&time); + std::ostringstream sstr; + sstr << std::setfill('0') + << days[tm->tm_wday] << " " + << months[tm->tm_mon] << " " + << std::setw(2) << tm->tm_mday << " " + << std::setw(2) << tm->tm_hour << ":" + << std::setw(2) << tm->tm_min << ":" + << std::setw(2) << tm->tm_sec << " " + << std::setw(4) << (tm->tm_year + 1900); + return sstr.str(); +} + +} // namespace Date + +} // namespace openmsx Copied: openmsx/trunk/src/utils/Date.hh (from rev 6671, openmsx/trunk/src/file/Date.hh) =================================================================== --- openmsx/trunk/src/utils/Date.hh (rev 0) +++ openmsx/trunk/src/utils/Date.hh 2007-06-27 14:31:15 UTC (rev 6672) @@ -0,0 +1,20 @@ +// $Id$ + +#ifndef DATE_HH +#define DATE_HH + +#include <string> +#include <time.h> + +namespace openmsx { + +namespace Date { +... [truncated message content] |