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