diff options
author | Alexis211 <alexis211@gmail.com> | 2009-12-20 15:21:26 +0100 |
---|---|---|
committer | Alexis211 <alexis211@gmail.com> | 2009-12-20 15:21:26 +0100 |
commit | cab353cbb21c142ac1e227d42338fa587e1a7f24 (patch) | |
tree | 618c50ba58cc3186b3b82a3df2561063d4aaee85 /Source/Library/Common | |
parent | 07a73aea7acbf0d9f9182bc3557583aa17af0000 (diff) | |
download | Melon-cab353cbb21c142ac1e227d42338fa587e1a7f24.tar.gz Melon-cab353cbb21c142ac1e227d42338fa587e1a7f24.zip |
Worked on IStream. Seems to work
Diffstat (limited to 'Source/Library/Common')
-rw-r--r-- | Source/Library/Common/IStream.proto.cpp | 73 | ||||
-rw-r--r-- | Source/Library/Common/IStream.proto.h | 29 |
2 files changed, 102 insertions, 0 deletions
diff --git a/Source/Library/Common/IStream.proto.cpp b/Source/Library/Common/IStream.proto.cpp new file mode 100644 index 0000000..0cc2a79 --- /dev/null +++ b/Source/Library/Common/IStream.proto.cpp @@ -0,0 +1,73 @@ +#include "IStream.proto.h" + +IStream::IStream() { + m_buffer = NULL; + m_ptr = 0; +} + +IStream::IStream(const IStream& other) { + m_buffer = NULL; + m_ptr = 0; +} + +IStream::~IStream() { + delete m_buffer; +} + +bool IStream::populate() { + String s = read(); + if (s.empty()) return false; + if (m_buffer == NULL) { + m_buffer = new SimpleList<String>(s); + } else { + m_buffer->addAtEnd(s); + } + return true; +} + +WChar IStream::getChar() { + waitLock(); + if (m_buffer == 0) { + if (!populate()) { + unlock(); + return WChar("\0"); + } + } + WChar ret = m_buffer->v()[m_ptr]; + m_ptr++; + if (m_ptr >= m_buffer->v().size()) { + m_buffer = m_buffer->delThis(); + m_ptr = 0; + } + unlock(); + return ret; +} + +String IStream::get(WChar delimiter) { + waitLock(); + //calculate length of string to read + if (m_buffer == 0) populate(); + int length = 0, ptr = m_ptr; + for (SimpleList<String> *iter = m_buffer; iter != 0;) { + if (iter->v()[ptr] == delimiter) break; + ptr++; + length++; + if (ptr >= iter->v().size()) { + if (iter->next() == 0) populate(); + iter = iter->next(); + ptr = 0; + } + } + //get it + String ret(WChar(" "), length); + for (int i = 0; i <= length; i++) { + if (i != length) ret[i] = m_buffer->v()[m_ptr]; + m_ptr++; + if (m_ptr >= m_buffer->v().size()) { + m_buffer = m_buffer->delThis(); + m_ptr = 0; + } + } + unlock(); + return ret; +} diff --git a/Source/Library/Common/IStream.proto.h b/Source/Library/Common/IStream.proto.h new file mode 100644 index 0000000..f689a22 --- /dev/null +++ b/Source/Library/Common/IStream.proto.h @@ -0,0 +1,29 @@ +#ifndef DEF_ISTREAM_PROTO_h +#define DEF_ISTREAM_PROTO_h + +#include <String.class.h> +#include <SimpleList.class.h> +#include <Mutex.class.h> + +class IStream : private Mutex { + private: + SimpleList<String> *m_buffer; + int m_ptr; + void operator =(IStream& other); + + bool populate(); + + protected: + virtual String read() = 0; + + public: + IStream(); + IStream(const IStream& other); + virtual ~IStream(); + + WChar getChar(); + String get(WChar delimiter = "\n"); + String getWord() { return get(" "); } +}; + +#endif |