|
Packit |
f0b94e |
/*
|
|
Packit |
f0b94e |
Copyright 2014-2015 Stanislav Ovsyannikov
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
Licensed under the Apache License, Version 2.0 (the "License");
|
|
Packit |
f0b94e |
you may not use this file except in compliance with the License.
|
|
Packit |
f0b94e |
You may obtain a copy of the License at
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
http://www.apache.org/licenses/LICENSE-2.0
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
Unless required by applicable law or agreed to in writing, software
|
|
Packit |
f0b94e |
distributed under the License is distributed on an "AS IS" BASIS,
|
|
Packit |
f0b94e |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
Packit |
f0b94e |
implied. See the License for the specific language governing permissions and
|
|
Packit |
f0b94e |
limitations under the License.
|
|
Packit |
f0b94e |
*/
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
#include "encoder.h"
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
using namespace cbor;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
encoder::encoder(output &out) { _out = &out; }
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
encoder::~encoder() {}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
void encoder::write_type_value(int major_type, unsigned int value) {
|
|
Packit |
f0b94e |
major_type <<= 5;
|
|
Packit |
f0b94e |
if (value < 24) {
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)(major_type | value));
|
|
Packit |
f0b94e |
} else if (value < 256) {
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)(major_type | 24));
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)value);
|
|
Packit |
f0b94e |
} else if (value < 65536) {
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)(major_type | 25));
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)(value >> 8));
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)value);
|
|
Packit |
f0b94e |
} else {
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)(major_type | 26));
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)(value >> 24));
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)(value >> 16));
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)(value >> 8));
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)value);
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
void encoder::write_type_value(int major_type, unsigned long long value) {
|
|
Packit |
f0b94e |
major_type <<= 5;
|
|
Packit |
f0b94e |
if (value < 24ULL) {
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)(major_type | value));
|
|
Packit |
f0b94e |
} else if (value < 256ULL) {
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)(major_type | 24));
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)value);
|
|
Packit |
f0b94e |
} else if (value < 65536ULL) {
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)(major_type | 25));
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)(value >> 8));
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)value);
|
|
Packit |
f0b94e |
} else if (value < 4294967296ULL) {
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)(major_type | 26));
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)(value >> 24));
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)(value >> 16));
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)(value >> 8));
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)value);
|
|
Packit |
f0b94e |
} else {
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)(major_type | 27));
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)(value >> 56));
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)(value >> 48));
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)(value >> 40));
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)(value >> 32));
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)(value >> 24));
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)(value >> 16));
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)(value >> 8));
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)value);
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
void encoder::write_int(unsigned int value) { write_type_value(0, value); }
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
void encoder::write_int(unsigned long long value) {
|
|
Packit |
f0b94e |
write_type_value(0, value);
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
void encoder::write_int(long long value) {
|
|
Packit |
f0b94e |
if (value < 0) {
|
|
Packit |
f0b94e |
write_type_value(1, (unsigned long long)-(value + 1));
|
|
Packit |
f0b94e |
} else {
|
|
Packit |
f0b94e |
write_type_value(0, (unsigned long long)value);
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
void encoder::write_int(int value) {
|
|
Packit |
f0b94e |
if (value < 0) {
|
|
Packit |
f0b94e |
write_type_value(1, (unsigned int)-(value + 1));
|
|
Packit |
f0b94e |
} else {
|
|
Packit |
f0b94e |
write_type_value(0, (unsigned int)value);
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
void encoder::write_bytes(const unsigned char *data, unsigned int size) {
|
|
Packit |
f0b94e |
write_type_value(2, size);
|
|
Packit |
f0b94e |
_out->put_bytes(data, size);
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
void encoder::write_string(const char *data, unsigned int size) {
|
|
Packit |
f0b94e |
write_type_value(3, size);
|
|
Packit |
f0b94e |
_out->put_bytes((const unsigned char *)data, size);
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
void encoder::write_string(const std::string str) {
|
|
Packit |
f0b94e |
write_type_value(3, (unsigned int)str.size());
|
|
Packit |
f0b94e |
_out->put_bytes((const unsigned char *)str.c_str(), (int)str.size());
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
void encoder::write_array(int size) { write_type_value(4, (unsigned int)size); }
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
void encoder::write_map(int size) { write_type_value(5, (unsigned int)size); }
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
void encoder::write_tag(const unsigned int tag) { write_type_value(6, tag); }
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
void encoder::write_special(int special) {
|
|
Packit |
f0b94e |
write_type_value(7, (unsigned int)special);
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
void encoder::write_bool(bool value) {
|
|
Packit |
f0b94e |
if (value == true) {
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)0xf5);
|
|
Packit |
f0b94e |
} else {
|
|
Packit |
f0b94e |
_out->put_byte((unsigned char)0xf4);
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
void encoder::write_null() { _out->put_byte((unsigned char)0xf6); }
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
void encoder::write_undefined() { _out->put_byte((unsigned char)0xf7); }
|