1 #include <string> 2 #include <sstream> 3 #include <cmath> 4 #include <algorithm> 5 #include "gif_fuzz_proto.pb.h" 6 7 namespace gifProtoFuzzer 8 { 9 class ProtoConverter 10 { 11 public: 12 std::string gifProtoToString(GifProto const &proto); 13 14 private: 15 template <class T> 16 void visit(google::protobuf::RepeatedPtrField<T> const &_repeated_field); 17 void visit(const GifProto &); 18 void visit(const Header &); 19 void visit(const LogicalScreenDescriptor &); 20 void visit(const GlobalColorTable &); 21 void visit(const ImageChunk &); 22 void visit(const BasicChunk &); 23 void visit(const ImageData &); 24 void visit(const SubBlock &); 25 void visit(const ImageDescriptor &); 26 void visit(const LocalColorTable &); 27 void visit(const GraphicControlExtension &); 28 void visit(const PlainTextExtension &); 29 void visit(const ApplicationExtension &); 30 void visit(const CommentExtension &); 31 void visit(const Trailer &); 32 33 // Utility functions 34 void writeByte(uint8_t x); 35 void writeWord(uint16_t x); 36 void writeInt(uint32_t x); 37 void writeLong(uint64_t x); 38 static uint16_t extractWordFromUInt32(uint32_t a); 39 static uint8_t extractByteFromUInt32(uint32_t a); 40 static uint32_t tableExpToTableSize(uint32_t tableExp); 41 42 std::stringstream m_output; 43 bool m_hasGCT = false; 44 bool m_hasLCT = false; 45 uint8_t m_globalColorExp = 0; 46 uint8_t m_localColorExp = 0; 47 48 static constexpr unsigned char m_sig[] = {0x47, 0x49, 0x46}; 49 static constexpr unsigned char m_ver89a[] = {0x38, 0x39, 0x61}; 50 static constexpr unsigned char m_ver87a[] = {0x38, 0x37, 0x61}; 51 }; 52 } // namespace gifProtoFuzzer