Index: sdch/open_vcdiff/depot/opensource/open-vcdiff/src/decodetable.cc |
=================================================================== |
--- sdch/open_vcdiff/depot/opensource/open-vcdiff/src/decodetable.cc (revision 2678) |
+++ sdch/open_vcdiff/depot/opensource/open-vcdiff/src/decodetable.cc (working copy) |
@@ -1,114 +0,0 @@ |
-// Copyright 2008 Google Inc. |
-// Author: Lincoln Smith |
-// |
-// Licensed under the Apache License, Version 2.0 (the "License"); |
-// you may not use this file except in compliance with the License. |
-// You may obtain a copy of the License at |
-// |
-// http://www.apache.org/licenses/LICENSE-2.0 |
-// |
-// Unless required by applicable law or agreed to in writing, software |
-// distributed under the License is distributed on an "AS IS" BASIS, |
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-// See the License for the specific language governing permissions and |
-// limitations under the License. |
-// |
-// VCDiffCodeTableReader is a class to interpret a stream of opcodes |
-// as VCDIFF instruction types, based on a VCDiffCodeTableData structure. |
- |
-#include <config.h> |
-#include "decodetable.h" |
-#include "codetable.h" |
-#include "logging.h" |
-#include "varint_bigendian.h" |
-#include "vcdiff_defs.h" |
- |
-namespace open_vcdiff { |
- |
-VCDiffCodeTableReader::VCDiffCodeTableReader() |
- : code_table_data_(&VCDiffCodeTableData::kDefaultCodeTableData), |
- non_default_code_table_data_(NULL), |
- instructions_and_sizes_(NULL), |
- instructions_and_sizes_end_(NULL), |
- last_instruction_start_(NULL), |
- pending_second_instruction_(kNoOpcode), |
- last_pending_second_instruction_(kNoOpcode) { |
-} |
- |
-bool VCDiffCodeTableReader::UseCodeTable( |
- const VCDiffCodeTableData& code_table_data, unsigned char max_mode) { |
- if (!code_table_data.Validate(max_mode)) return false; |
- if (!non_default_code_table_data_.get()) { |
- non_default_code_table_data_.reset(new VCDiffCodeTableData); |
- } |
- *non_default_code_table_data_ = code_table_data; |
- code_table_data_ = non_default_code_table_data_.get(); |
- return true; |
-} |
- |
-VCDiffInstructionType VCDiffCodeTableReader::GetNextInstruction( |
- int32_t* size, |
- unsigned char* mode) { |
- if (!instructions_and_sizes_) { |
- LOG(ERROR) << "Internal error: GetNextInstruction() called before Init()" |
- << LOG_ENDL; |
- return VCD_INSTRUCTION_ERROR; |
- } |
- last_instruction_start_ = *instructions_and_sizes_; |
- last_pending_second_instruction_ = pending_second_instruction_; |
- unsigned char opcode = 0; |
- unsigned char instruction_type = VCD_NOOP; |
- int32_t instruction_size = 0; |
- unsigned char instruction_mode = 0; |
- do { |
- if (pending_second_instruction_ != kNoOpcode) { |
- // There is a second instruction left over |
- // from the most recently processed opcode. |
- opcode = static_cast<unsigned char>(pending_second_instruction_); |
- pending_second_instruction_ = kNoOpcode; |
- instruction_type = code_table_data_->inst2[opcode]; |
- instruction_size = code_table_data_->size2[opcode]; |
- instruction_mode = code_table_data_->mode2[opcode]; |
- break; |
- } |
- if (*instructions_and_sizes_ >= instructions_and_sizes_end_) { |
- // Ran off end of instruction stream |
- return VCD_INSTRUCTION_END_OF_DATA; |
- } |
- opcode = **instructions_and_sizes_; |
- if (code_table_data_->inst2[opcode] != VCD_NOOP) { |
- // This opcode contains two instructions; process the first one now, and |
- // save a pointer to the second instruction, which should be returned |
- // by the next call to GetNextInstruction |
- pending_second_instruction_ = **instructions_and_sizes_; |
- } |
- ++(*instructions_and_sizes_); |
- instruction_type = code_table_data_->inst1[opcode]; |
- instruction_size = code_table_data_->size1[opcode]; |
- instruction_mode = code_table_data_->mode1[opcode]; |
- // This do-while loop is necessary in case inst1 == VCD_NOOP for an opcode |
- // that was actually used in the encoding. That case is unusual, but it |
- // is not prohibited by the standard. |
- } while (instruction_type == VCD_NOOP); |
- if (instruction_size == 0) { |
- // Parse the size as a Varint in the instruction stream. |
- switch (*size = VarintBE<int32_t>::Parse(instructions_and_sizes_end_, |
- instructions_and_sizes_)) { |
- case RESULT_ERROR: |
- LOG(ERROR) << "Instruction size is not a valid variable-length integer" |
- << LOG_ENDL; |
- return VCD_INSTRUCTION_ERROR; |
- case RESULT_END_OF_DATA: |
- UnGetInstruction(); // Rewind to instruction start |
- return VCD_INSTRUCTION_END_OF_DATA; |
- default: |
- break; // Successfully parsed Varint |
- } |
- } else { |
- *size = instruction_size; |
- } |
- *mode = instruction_mode; |
- return static_cast<VCDiffInstructionType>(instruction_type); |
-} |
- |
-}; // namespace open_vcdiff |