-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathstream.h
80 lines (70 loc) · 2.16 KB
/
stream.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/**
*
* Copyright (c) 2010-2015 Voidware Ltd. All Rights Reserved.
*
* This file contains Original Code and/or Modifications of Original Code as
* defined in and that are subject to the Voidware Public Source Licence version
* 1.0 (the 'Licence'). You may not use this file except in compliance with the
* Licence or with expressly written permission from Voidware. Please obtain a
* copy of the Licence at http://www.voidware.com/legal/vpsl1.txt and read it
* before using this file.
*
* The Original Code and all software distributed under the Licence are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
* OR IMPLIED, AND VOIDWARE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING
* WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
*
* Please see the Licence for the specific language governing rights and
* limitations under the Licence.
*
*/
#ifndef __stream_h__
#define __stream_h__
struct Streamer
{
virtual void put(char) = 0;
virtual void unput() = 0;
virtual void put(const char*) = 0;
virtual char* finish() = 0;
virtual int get() = 0;
};
struct BufStreamer: public Streamer
{
BufStreamer(char* buf, int bsize)
: buf_(buf), size_(bsize) { pos_ = buf_; }
void put(char c)
{
if (pos_ - buf_ < size_-1) *pos_++ = c;
}
void unput()
{
// erase a charater
if (pos_ > buf_) --pos_;
}
void put(const char* s)
{
while (*s)
{
if (pos_ - buf_ < size_-1) *pos_++ = *s;
++s;
}
}
char* finish()
{
*pos_ = 0;
pos_ = buf_;
return buf_;
}
int get()
{
/* get character at last position */
if (pos_ > buf_) return pos_[-1];
return 0;
}
char* buf_;
int size_;
char* pos_;
};
#endif // __stream_h__