You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.5 KiB
52 lines
1.5 KiB
#include <string>
|
|
#include <sstream>
|
|
#include <cmath>
|
|
#include <algorithm>
|
|
#include "gif_fuzz_proto.pb.h"
|
|
|
|
namespace gifProtoFuzzer
|
|
{
|
|
class ProtoConverter
|
|
{
|
|
public:
|
|
std::string gifProtoToString(GifProto const &proto);
|
|
|
|
private:
|
|
template <class T>
|
|
void visit(google::protobuf::RepeatedPtrField<T> const &_repeated_field);
|
|
void visit(const GifProto &);
|
|
void visit(const Header &);
|
|
void visit(const LogicalScreenDescriptor &);
|
|
void visit(const GlobalColorTable &);
|
|
void visit(const ImageChunk &);
|
|
void visit(const BasicChunk &);
|
|
void visit(const ImageData &);
|
|
void visit(const SubBlock &);
|
|
void visit(const ImageDescriptor &);
|
|
void visit(const LocalColorTable &);
|
|
void visit(const GraphicControlExtension &);
|
|
void visit(const PlainTextExtension &);
|
|
void visit(const ApplicationExtension &);
|
|
void visit(const CommentExtension &);
|
|
void visit(const Trailer &);
|
|
|
|
// Utility functions
|
|
void writeByte(uint8_t x);
|
|
void writeWord(uint16_t x);
|
|
void writeInt(uint32_t x);
|
|
void writeLong(uint64_t x);
|
|
static uint16_t extractWordFromUInt32(uint32_t a);
|
|
static uint8_t extractByteFromUInt32(uint32_t a);
|
|
static uint32_t tableExpToTableSize(uint32_t tableExp);
|
|
|
|
std::stringstream m_output;
|
|
bool m_hasGCT = false;
|
|
bool m_hasLCT = false;
|
|
uint8_t m_globalColorExp = 0;
|
|
uint8_t m_localColorExp = 0;
|
|
|
|
static constexpr unsigned char m_sig[] = {0x47, 0x49, 0x46};
|
|
static constexpr unsigned char m_ver89a[] = {0x38, 0x39, 0x61};
|
|
static constexpr unsigned char m_ver87a[] = {0x38, 0x37, 0x61};
|
|
};
|
|
} // namespace gifProtoFuzzer
|