// 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. // // Types and value definitions to support the implementation of RFC 3284 - // The VCDIFF Generic Differencing and Compression Data Format. // The RFC text can be found at http://www.faqs.org/rfcs/rfc3284.html // Many of the definitions below reference sections in that text. #ifndef OPEN_VCDIFF_VCDIFF_DEFS_H_ #define OPEN_VCDIFF_VCDIFF_DEFS_H_ #include <config.h> #include <limits.h> // UCHAR_MAX #include <stdint.h> // int32_t namespace open_vcdiff { enum VCDiffResult { RESULT_SUCCESS = 0, // Many functions within open-vcdiff return signed integer types, // and can also return either of these special negative values: // // An error occurred while performing the requested operation. RESULT_ERROR = -1, // The end of available data was reached // before the requested operation could be completed. RESULT_END_OF_DATA = -2 }; // The delta file header section as described in section 4.1 of the RFC: // // "Each delta file starts with a header section organized as below. // Note the convention that square-brackets enclose optional items. // // Header1 - byte = 0xD6 // Header2 - byte = 0xC3 // Header3 - byte = 0xC4 // Header4 - byte // Hdr_Indicator - byte // [Secondary compressor ID] - byte // [Length of code table data] - integer // [Code table data] // // The first three Header bytes are the ASCII characters 'V', 'C' and // 'D' with their most significant bits turned on (in hexadecimal, the // values are 0xD6, 0xC3, and 0xC4). The fourth Header byte is // currently set to zero. In the future, it might be used to indicate // the version of Vcdiff." // typedef struct DeltaFileHeader { unsigned char header1; // Always 0xD6 ('V' | 0x80) unsigned char header2; // Always 0xC3 ('C' | 0x80) unsigned char header3; // Always 0xC4 ('D' | 0x80) unsigned char header4; // 0x00 for standard format, 'S' if extensions used unsigned char hdr_indicator; } DeltaFileHeader; // The possible values for the Hdr_Indicator field, as described // in section 4.1 of the RFC: // // "The Hdr_Indicator byte shows if there is any initialization data // required to aid in the reconstruction of data in the Window sections. // This byte MAY have non-zero values for either, both, or neither of // the two bits VCD_DECOMPRESS and VCD_CODETABLE below: // // 7 6 5 4 3 2 1 0 // +-+-+-+-+-+-+-+-+ // | | | | | | | | | // +-+-+-+-+-+-+-+-+ // ^ ^ // | | // | +-- VCD_DECOMPRESS // +---- VCD_CODETABLE // // If bit 0 (VCD_DECOMPRESS) is non-zero, this indicates that a // secondary compressor may have been used to further compress certain // parts of the delta encoding data [...]" // [Secondary compressors are not supported by open-vcdiff.] // // "If bit 1 (VCD_CODETABLE) is non-zero, this indicates that an // application-defined code table is to be used for decoding the delta // instructions. [...]" // const unsigned char VCD_DECOMPRESS = 0x01; const unsigned char VCD_CODETABLE = 0x02; // The possible values for the Win_Indicator field, as described // in section 4.2 of the RFC: // // "Win_Indicator: // // This byte is a set of bits, as shown: // // 7 6 5 4 3 2 1 0 // +-+-+-+-+-+-+-+-+ // | | | | | | | | | // +-+-+-+-+-+-+-+-+ // ^ ^ // | | // | +-- VCD_SOURCE // +---- VCD_TARGET // // If bit 0 (VCD_SOURCE) is non-zero, this indicates that a // segment of data from the "source" file was used as the // corresponding source window of data to encode the target // window. The decoder will use this same source data segment to // decode the target window. // // If bit 1 (VCD_TARGET) is non-zero, this indicates that a // segment of data from the "target" file was used as the // corresponding source window of data to encode the target // window. As above, this same source data segment is used to // decode the target window. // // The Win_Indicator byte MUST NOT have more than one of the bits // set (non-zero). It MAY have none of these bits set." // const unsigned char VCD_SOURCE = 0x01; const unsigned char VCD_TARGET = 0x02; // If this flag is set, the delta window includes an Adler32 checksum // of the target window data. Not part of the RFC draft standard. const unsigned char VCD_CHECKSUM = 0x04; // The possible values for the Delta_Indicator field, as described // in section 4.3 of the RFC: // // "Delta_Indicator: // This byte is a set of bits, as shown: // // 7 6 5 4 3 2 1 0 // +-+-+-+-+-+-+-+-+ // | | | | | | | | | // +-+-+-+-+-+-+-+-+ // ^ ^ ^ // | | | // | | +-- VCD_DATACOMP // | +---- VCD_INSTCOMP // +------ VCD_ADDRCOMP // // VCD_DATACOMP: bit value 1. // VCD_INSTCOMP: bit value 2. // VCD_ADDRCOMP: bit value 4. // // [...] If the bit VCD_DECOMPRESS (Section 4.1) was on, each of these // sections may have been compressed using the specified secondary // compressor. The bit positions 0 (VCD_DATACOMP), 1 // (VCD_INSTCOMP), and 2 (VCD_ADDRCOMP) respectively indicate, if // non-zero, that the corresponding parts are compressed." // [Secondary compressors are not supported, so open-vcdiff decoding will fail // if these bits are not all zero.] // const unsigned char VCD_DATACOMP = 0x01; const unsigned char VCD_INSTCOMP = 0x02; const unsigned char VCD_ADDRCOMP = 0x04; // A COPY address has 32 bits, which places a limit // of 2GB on the maximum combined size of the dictionary plus // the target window (= the chunk of data to be encoded.) typedef int32_t VCDAddress; // The address modes used for COPY instructions, as defined in // section 5.3 of the RFC. // // The first two modes (0 and 1) are defined as SELF (addressing forward // from the beginning of the source window) and HERE (addressing backward // from the current position in the source window + previously decoded // target data.) // // After those first two modes, there are a variable number of NEAR modes // (which take a recently-used address and add a positive offset to it) // and SAME modes (which match a previously-used address using a "hash" of // the lowest bits of the address.) The number of NEAR and SAME modes // depends on the defined size of the address cache; since this number is // variable, these modes cannot be specified as enum values. enum VCDiffModes { VCD_SELF_MODE = 0, VCD_HERE_MODE = 1, VCD_FIRST_NEAR_MODE = 2, VCD_MAX_MODES = UCHAR_MAX + 1 // 256 }; } // namespace open_vcdiff #endif // OPEN_VCDIFF_VCDIFF_DEFS_H_