aboutsummaryrefslogtreecommitdiff
path: root/src/vcdiff_defs.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/vcdiff_defs.h')
-rw-r--r--src/vcdiff_defs.h196
1 files changed, 196 insertions, 0 deletions
diff --git a/src/vcdiff_defs.h b/src/vcdiff_defs.h
new file mode 100644
index 0000000..b59af53
--- /dev/null
+++ b/src/vcdiff_defs.h
@@ -0,0 +1,196 @@
+// 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_