-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathscsp_cpp.hpp
More file actions
177 lines (127 loc) · 4.41 KB
/
scsp_cpp.hpp
File metadata and controls
177 lines (127 loc) · 4.41 KB
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
// Implemented by Vitaly "_Vi" Shukela in 2017; License = MIT or Apache 2.0
// Helper functions for C++
#ifndef _SCSP_CPP_HPP
#define _SCSP_CPP_HPP
#include <cstddef>
#include <cstdint>
#ifndef SCSP_INT
#define SCSP_INT int64_t
#endif
#ifndef SCSP_ENABLE_FLOAT
#define SCSP_ENABLE_FLOAT 1
#endif
#ifndef SCSP_EXPORT
#define SCSP_EXPORT
#endif
#ifndef SCSP_ENABLE_IOSTREAM
#define SCSP_ENABLE_IOSTREAM 1
#endif
#if SCSP_ENABLE_IOSTREAM
#include <iosfwd>
#endif
namespace scsp {
class Callbacks;
#if SCSP_ENABLE_IOSTREAM
/** true means success */
bool SCSP_EXPORT parse_from_istream(
std::istream& is,
class Callbacks& callbacks);
#endif
/** true means success */
SCSP_INT SCSP_EXPORT parse_from_memory(
const void *buffer,
size_t count,
class Callbacks& callbacks);
/** see description in scsp.h. */
SCSP_INT SCSP_EXPORT parse_from_fd(
int fd,
class Callbacks& callbacks);
/** Parse bit-by-bit. see description in scsp.h */
SCSP_INT SCSP_EXPORT parse_lowlevel(
class State& state,
class Callbacks& callbacks,
const void* buf,
size_t count);
class Callbacks {
public:
virtual void integer(SCSP_INT value) =0;
virtual void bytestring_opened(SCSP_INT size_or_minus_one) =0;
virtual void bytestring_chunk(const uint8_t* buf, size_t len) =0;
virtual void bytestring_closed() =0;
virtual void string_opened(SCSP_INT size_or_minus_one) =0;
virtual void string_chunk(const uint8_t* buf, size_t len) =0;
virtual void string_closed() =0;
virtual void array_opened(SCSP_INT size_or_minus_one)=0;
virtual void array_item()=0;
virtual void array_closed()=0;
virtual void map_opened(SCSP_INT size_or_minus_one)=0;
virtual void map_key()=0;
virtual void map_value()=0;
virtual void map_closed()=0;
// 'T' - true, 'F' - false, 'N' - null, 'U' - undefined
virtual void simple (char value)=0;
virtual void simple_other (SCSP_INT value)=0;
virtual void tag (SCSP_INT value)=0;
#if SCSP_ENABLE_FLOAT
virtual void noninteger (double value)=0;
#endif
};
class CallbacksEmpty : public Callbacks {
public:
virtual void integer(SCSP_INT value) {}
virtual void bytestring_opened(SCSP_INT size_or_minus_one) {}
virtual void bytestring_chunk(const uint8_t* buf, size_t len) {}
virtual void bytestring_closed() {}
virtual void string_opened(SCSP_INT size_or_minus_one) {}
virtual void string_chunk(const uint8_t* buf, size_t len) {}
virtual void string_closed() {}
virtual void array_opened(SCSP_INT size_or_minus_one){}
virtual void array_item(){}
virtual void array_closed(){}
virtual void map_opened(SCSP_INT size_or_minus_one){}
virtual void map_key(){}
virtual void map_value(){}
virtual void map_closed(){}
virtual void simple (char value){}
virtual void simple_other (SCSP_INT value){}
virtual void tag (SCSP_INT value){}
#if SCSP_ENABLE_FLOAT
virtual void noninteger (double value){}
#endif
};
class State;
class State* new_state();
void delete_state(class State* state);
#if SCSP_ENABLE_IOSTREAM
/* Note: all strings, bytestrings, arrays and maps are streamed */
/* In contrary to the RFC, string chunks may split UTF-8 character's bytes apart */
class Generator : public Callbacks {
public:
Generator(std::ostream &os) : o(os) {}
private:
std::ostream& o;
void writething(uint8_t maj, uint64_t thing);
virtual void integer(SCSP_INT value) ;
virtual void bytestring_opened(SCSP_INT size_or_minus_one) ;
virtual void bytestring_chunk(const uint8_t* buf, size_t len) ;
virtual void bytestring_closed() ;
virtual void string_opened(SCSP_INT size_or_minus_one) ;
virtual void string_chunk(const uint8_t* buf, size_t len) ;
virtual void string_closed() ;
virtual void array_opened(SCSP_INT size_or_minus_one);
virtual void array_item();
virtual void array_closed();
virtual void map_opened(SCSP_INT size_or_minus_one);
virtual void map_key();
virtual void map_value();
virtual void map_closed();
virtual void simple (char value);
virtual void simple_other (SCSP_INT value);
virtual void tag (SCSP_INT value);
#if SCSP_ENABLE_FLOAT
virtual void noninteger (double value);
#endif
};
#endif
} // namespace scsp
#endif // _SCSP_CPP_HPP