@@ -154,57 +154,69 @@ void save_raw(std::streambuf &sb, const void *address, std::size_t count) {
154154 throw std::runtime_error (" Output stream error." );
155155}
156156
157+ void save_byte (std::streambuf& sb, uint8_t v) {
158+ if (sb.sputc (*reinterpret_cast <const char *>(&v)) == std::streambuf::traits_type::eof ())
159+ throw std::runtime_error (" Output stream error." );
160+ }
161+
157162// / Helper function to load raw binary data from a stream buffer.
158163void load_raw (std::streambuf &sb, void *address, std::size_t count) {
159164 if ((std::size_t )sb.sgetn ((char *)address, (std::streamsize)count) != count)
160165 throw std::runtime_error (" Input stream error." );
161166}
162167
168+ uint8_t load_byte (std::streambuf &sb) {
169+ auto res = sb.sbumpc ();
170+ if (res == std::streambuf::traits_type::eof ())
171+ throw std::runtime_error (" Input stream error." );
172+ return static_cast <uint8_t >(res);
173+ }
174+
163175// / Load a value from a stream buffer with correct endian treatment.
164- template <typename T> T load_value (std::streambuf &sb, int use_byte_order ) {
176+ template <typename T> T load_value (std::streambuf &sb, bool reverse_byte_order ) {
165177 T tmp;
166178 load_raw (sb, &tmp, sizeof (T));
167- if (sizeof (T) > 1 && use_byte_order != LSL_BYTE_ORDER ) endian_reverse_inplace (tmp);
179+ if (sizeof (T) > 1 && reverse_byte_order ) endian_reverse_inplace (tmp);
168180 return tmp;
169181}
170182
171183// / Save a value to a stream buffer with correct endian treatment.
172- template <typename T> void save_value (std::streambuf &sb, T v, int use_byte_order ) {
173- if (use_byte_order != LSL_BYTE_ORDER ) endian_reverse_inplace (v);
184+ template <typename T> void save_value (std::streambuf &sb, T v, bool reverse_byte_order ) {
185+ if (sizeof (T) > 1 && reverse_byte_order ) endian_reverse_inplace (v);
174186 save_raw (sb, &v, sizeof (T));
175187}
176188
177189void sample::save_streambuf (
178- std::streambuf &sb, int /* protocol_version*/ , int use_byte_order , void *scratchpad) const {
190+ std::streambuf &sb, int /* protocol_version*/ , bool reverse_byte_order , void *scratchpad) const {
179191 // write sample header
180192 if (timestamp == DEDUCED_TIMESTAMP) {
181- save_value (sb, TAG_DEDUCED_TIMESTAMP, use_byte_order );
193+ save_byte (sb, TAG_DEDUCED_TIMESTAMP);
182194 } else {
183- save_value (sb, TAG_TRANSMITTED_TIMESTAMP, use_byte_order );
184- save_value (sb, timestamp, use_byte_order );
195+ save_byte (sb, TAG_TRANSMITTED_TIMESTAMP);
196+ save_value (sb, timestamp, reverse_byte_order );
185197 }
186198 // write channel data
187199 if (format_ == cft_string) {
188200 for (const auto &str : samplevals<std::string>(*this )) {
189201 // write string length as variable-length integer
190202 if (str.size () <= 0xFF ) {
191- save_value (sb, ( uint8_t ) sizeof (uint8_t ), use_byte_order );
192- save_value (sb, static_cast <uint8_t >(str.size ()), use_byte_order );
203+ save_byte (sb, static_cast < uint8_t >( sizeof (uint8_t )) );
204+ save_byte (sb, static_cast <uint8_t >(str.size ()));
193205 } else {
194206 if (str.size () <= 0xFFFFFFFF ) {
195- save_value (sb, ( uint8_t ) sizeof (uint32_t ), use_byte_order );
196- save_value (sb, static_cast <uint32_t >(str.size ()), use_byte_order );
207+ save_byte (sb, static_cast < uint8_t >( sizeof (uint32_t )) );
208+ save_value (sb, static_cast <uint32_t >(str.size ()), reverse_byte_order );
197209 } else {
198- save_value (sb, ( uint8_t ) sizeof (uint64_t ), use_byte_order );
199- save_value (sb, static_cast <std::size_t >(str.size ()), use_byte_order );
210+ save_byte (sb, static_cast < uint8_t >( sizeof (uint64_t )) );
211+ save_value (sb, static_cast <std::size_t >(str.size ()), reverse_byte_order );
200212 }
201213 }
202214 // write string contents
203215 if (!str.empty ()) save_raw (sb, str.data (), str.size ());
204216 }
205217 } else {
206218 // write numeric data in binary
207- if (use_byte_order == LSL_BYTE_ORDER || format_sizes[format_] == 1 ) {
219+ if (!reverse_byte_order || format_sizes[format_] == 1 ) {
208220 save_raw (sb, &data_, datasize ());
209221 } else {
210222 memcpy (scratchpad, &data_, datasize ());
@@ -215,31 +227,31 @@ void sample::save_streambuf(
215227}
216228
217229void sample::load_streambuf (
218- std::streambuf &sb, int /* unused*/ , int use_byte_order , bool suppress_subnormals) {
230+ std::streambuf &sb, int /* unused*/ , bool reverse_byte_order , bool suppress_subnormals) {
219231 // read sample header
220- if (load_value< uint8_t > (sb, use_byte_order ) == TAG_DEDUCED_TIMESTAMP)
232+ if (load_byte (sb) == TAG_DEDUCED_TIMESTAMP)
221233 // deduce the timestamp
222234 timestamp = DEDUCED_TIMESTAMP;
223235 else
224236 // read the time stamp
225- timestamp = load_value<double >(sb, use_byte_order );
237+ timestamp = load_value<double >(sb, reverse_byte_order );
226238
227239 // read channel data
228240 if (format_ == cft_string) {
229241 for (auto &str : samplevals<std::string>(*this )) {
230242 // read string length as variable-length integer
231243 std::size_t len = 0 ;
232- auto lenbytes = load_value< uint8_t > (sb, use_byte_order );
244+ auto lenbytes = load_byte (sb);
233245
234246 if (sizeof (std::size_t ) < 8 && lenbytes > sizeof (std::size_t ))
235247 throw std::runtime_error (
236248 " This platform does not support strings of 64-bit length." );
237249 switch (lenbytes) {
238- case sizeof (uint8_t ): len = load_value< uint8_t > (sb, use_byte_order ); break ;
239- case sizeof (uint16_t ): len = load_value<uint16_t >(sb, use_byte_order ); break ;
240- case sizeof (uint32_t ): len = load_value<uint32_t >(sb, use_byte_order ); break ;
250+ case sizeof (uint8_t ): len = load_byte (sb); break ;
251+ case sizeof (uint16_t ): len = load_value<uint16_t >(sb, reverse_byte_order ); break ;
252+ case sizeof (uint32_t ): len = load_value<uint32_t >(sb, reverse_byte_order ); break ;
241253#ifndef BOOST_NO_INT64_T
242- case sizeof (uint64_t ): len = load_value<uint64_t >(sb, use_byte_order ); break ;
254+ case sizeof (uint64_t ): len = load_value<uint64_t >(sb, reverse_byte_order ); break ;
243255#endif
244256 default : throw std::runtime_error (" Stream contents corrupted (invalid varlen int)." );
245257 }
@@ -250,8 +262,8 @@ void sample::load_streambuf(
250262 } else {
251263 // read numeric channel data
252264 load_raw (sb, &data_, datasize ());
253- if (use_byte_order != LSL_BYTE_ORDER && format_sizes[format_] > 1 )
254- convert_endian (&data_, num_channels_ , format_sizes[format_]);
265+ if (reverse_byte_order && format_sizes[format_] > 1 )
266+ convert_endian (&data_, num_channels () , format_sizes[format_]);
255267 if (suppress_subnormals && format_float[format_]) {
256268 if (format_ == cft_float32) {
257269 for (auto &val : samplevals<uint32_t >(*this ))
0 commit comments