X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fio%2Fmemory.cpp;h=c5aee1e0536e040e72187172b2c084269596cce9;hp=6ea130b54ae134478ab40851f4c49cf1d68ad439;hb=481b844ed7d180ffbf70223075f2fc1ffdb5b444;hpb=6e0fd758970bcb5bad5e3f2454b694cc4d7b4b66 diff --git a/source/io/memory.cpp b/source/io/memory.cpp index 6ea130b..c5aee1e 100644 --- a/source/io/memory.cpp +++ b/source/io/memory.cpp @@ -1,6 +1,6 @@ #include #include -#include "except.h" +#include "handle.h" #include "memory.h" using namespace std; @@ -8,14 +8,14 @@ using namespace std; namespace Msp { namespace IO { -Memory::Memory(char *d, unsigned s) +Memory::Memory(char *d, unsigned s, Mode m) { - init(d, d+s, M_RDWR); + init(d, d+s, m); } -Memory::Memory(char *b, char *e) +Memory::Memory(char *b, char *e, Mode m) { - init(b, e, M_RDWR); + init(b, e, m); } Memory::Memory(const char *cd, unsigned s) @@ -37,9 +37,14 @@ void Memory::init(char *b, char *e, Mode m) mode = m; } +void Memory::set_block(bool) +{ + throw logic_error("Memory::set_block"); +} + unsigned Memory::do_write(const char *buf, unsigned size) { - check_mode(M_WRITE); + check_access(M_WRITE); size = min(size, end-pos); memcpy(pos, buf, size); @@ -49,9 +54,11 @@ unsigned Memory::do_write(const char *buf, unsigned size) unsigned Memory::do_read(char *buf, unsigned size) { + check_access(M_READ); + if(pos==end) { - eof_flag = true; + set_eof(); return 0; } @@ -63,32 +70,50 @@ unsigned Memory::do_read(char *buf, unsigned size) unsigned Memory::put(char c) { - check_mode(M_WRITE); + check_access(M_WRITE); + + if(pos==end) + return 0; + *pos++ = c; return 1; } bool Memory::getline(string &line) { + check_access(M_READ); + + if(pos==end) + { + set_eof(); + return false; + } + char *nl = find(pos, end, '\n'); line.assign(pos, nl); - bool result = (nl!=pos); - pos = nl; - return result; + pos = (nl==end ? end : nl+1); + return true; } int Memory::get() { + check_access(M_READ); + if(pos==end) { - eof_flag = true; + set_eof(); return -1; } return static_cast(*pos++); } -unsigned Memory::seek(int off, SeekType type) +const Handle &Memory::get_handle(Mode) +{ + throw logic_error("Memory::get_handle"); +} + +SeekOffset Memory::seek(SeekOffset off, SeekType type) { char *new_pos; if(type==S_BEG) @@ -98,30 +123,15 @@ unsigned Memory::seek(int off, SeekType type) else if(type==S_END) new_pos = end+off; else - throw InvalidParameterValue("Invalid seek type"); + throw invalid_argument("Memory::seek"); if(new_posend) - throw InvalidParameterValue("Invalid seek offset"); + throw bad_seek(off, type); pos = new_pos; + eof_flag = false; return pos-begin; } -Handle Memory::get_event_handle() -{ - throw Exception("Memory doesn't support events"); -} - -void Memory::check_mode(Mode m) const -{ - if(m==M_WRITE) - { - if(!(mode&M_WRITE)) - throw InvalidState("Memory is not writable"); - if(pos==end) - throw InvalidState("Attempt to write past end of Memory"); - } -} - } // namespace IO } // namespace Msp