Blame dom/webauthn/cbor-cpp/src/encoder.cpp

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); }