]> git.tdb.fi Git - libs/core.git/blob - source/io/memory.cpp
Add new exception classes for some common errors
[libs/core.git] / source / io / memory.cpp
1 #include <algorithm>
2 #include <cstring>
3 #include <msp/core/except.h>
4 #include "handle.h"
5 #include "memory.h"
6
7 using namespace std;
8
9 namespace Msp {
10 namespace IO {
11
12 Memory::Memory(char *b, char *e, Mode m)
13 {
14         begin = b;
15         end = e;
16         pos = begin;
17         mode = m;
18 }
19
20 void Memory::set_block(bool)
21 {
22         throw unsupported("Memory::set_block");
23 }
24
25 void Memory::set_inherit(bool)
26 {
27         throw unsupported("Memory::set_inherit");
28 }
29
30 size_t Memory::do_write(const char *buf, size_t size)
31 {
32         check_access(M_WRITE);
33
34         size = min<size_t>(size, end-pos);
35         memcpy(pos, buf, size);
36         pos += size;
37         return size;
38 }
39
40 size_t Memory::do_read(char *buf, size_t size)
41 {
42         check_access(M_READ);
43
44         if(pos==end)
45         {
46                 set_eof();
47                 return 0;
48         }
49
50         size = min<size_t>(size, end-pos);
51         memcpy(buf, pos, size);
52         pos += size;
53         return size;
54 }
55
56 size_t Memory::put(char c)
57 {
58         check_access(M_WRITE);
59
60         if(pos==end)
61                 return 0;
62
63         *pos++ = c;
64         return 1;
65 }
66
67 bool Memory::getline(string &line)
68 {
69         check_access(M_READ);
70
71         if(pos==end)
72         {
73                 set_eof();
74                 return false;
75         }
76
77         char *nl = find(pos, end, '\n');
78         line.assign(pos, nl);
79         pos = (nl==end ? end : nl+1);
80         return true;
81 }
82
83 int Memory::get()
84 {
85         check_access(M_READ);
86
87         if(pos==end)
88         {
89                 set_eof();
90                 return -1;
91         }
92
93         return static_cast<unsigned char>(*pos++);
94 }
95
96 const Handle &Memory::get_handle(Mode)
97 {
98         throw unsupported("Memory::get_handle");
99 }
100
101 SeekOffset Memory::seek(SeekOffset off, SeekType type)
102 {
103         char *new_pos;
104         if(type==S_BEG)
105                 new_pos = begin+off;
106         else if(type==S_CUR)
107                 new_pos = pos+off;
108         else if(type==S_END)
109                 new_pos = end+off;
110         else
111                 throw invalid_argument("Memory::seek");
112
113         if(new_pos<begin || new_pos>end)
114                 throw bad_seek(off, type);
115
116         pos = new_pos;
117         eof_flag = false;
118         return pos-begin;
119 }
120
121 } // namespace IO
122 } // namespace Msp