1 // Mode: -*- C++ -*- 2 3 class Delta { 4 public: Delta(const Block & block)5 Delta(const Block &block) { 6 int ret; 7 xd3_config config; 8 memset(&stream_, 0, sizeof (stream_)); 9 memset(&config, 0, sizeof (config)); 10 11 xd3_init_config(&config, XD3_SKIP_EMIT | XD3_ADLER32_NOVER); 12 13 CHECK_EQ(0, xd3_config_stream (&stream_, &config)); 14 15 xd3_avail_input (&stream_, block.Data(), block.Size()); 16 17 bool done = false; 18 while (!done) { 19 ret = xd3_decode_input(&stream_); 20 21 switch (ret) { 22 case XD3_INPUT: 23 done = true; 24 break; 25 case XD3_OUTPUT: 26 CHECK_EQ(0, xd3_whole_append_window (&stream_)); 27 break; 28 case XD3_GOTHEADER: 29 case XD3_WINSTART: 30 case XD3_WINFINISH: 31 break; 32 default: 33 cerr << "decode: " << done; 34 abort(); 35 } 36 } 37 } 38 ~Delta()39 ~Delta() { 40 xd3_free_stream(&stream_); 41 } 42 AddedBytes()43 xoff_t AddedBytes() const { 44 return stream_.whole_target.addslen; 45 } 46 Windows()47 xoff_t Windows() const { 48 return stream_.whole_target.wininfolen; 49 } 50 51 // Note: This does not benefit from -Wformat= checking, due to the 52 // enclosing template. Further, it was not used. 53 // void Print() const { 54 // for (size_t i = 0; i < stream_.whole_target.instlen; i++) { 55 // xd3_winst &winst = stream_.whole_target.inst[i]; 56 // switch (winst.type) { 57 // case XD3_RUN: 58 // DP(RINT, "%" Q "u run %" W "u\n", winst.position, winst.size); 59 // break; 60 // case XD3_ADD: 61 // DP(RINT "%" Q "u add %" W "u\n", winst.position, winst.size); 62 // break; 63 // default: 64 // DP(RINT "%" Q "u copy %" W "u @ %" Q "u (mode %u)\n", 65 // winst.position, winst.size, winst.addr, winst.mode); 66 // break; 67 // } 68 // } 69 // } 70 71 private: 72 xd3_stream stream_; 73 }; 74