Home | History | Annotate | Download | only in src
      1 // Copyright 2008 Google Inc.
      2 // Author: Lincoln Smith
      3 //
      4 // Licensed under the Apache License, Version 2.0 (the "License");
      5 // you may not use this file except in compliance with the License.
      6 // You may obtain a copy of the License at
      7 //
      8 //      http://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 // Unless required by applicable law or agreed to in writing, software
     11 // distributed under the License is distributed on an "AS IS" BASIS,
     12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 // See the License for the specific language governing permissions and
     14 // limitations under the License.
     15 //
     16 // Types and value definitions to support the implementation of RFC 3284 -
     17 // The VCDIFF Generic Differencing and Compression Data Format.
     18 // The RFC text can be found at http://www.faqs.org/rfcs/rfc3284.html
     19 // Many of the definitions below reference sections in that text.
     20 
     21 #ifndef OPEN_VCDIFF_VCDIFF_DEFS_H_
     22 #define OPEN_VCDIFF_VCDIFF_DEFS_H_
     23 
     24 #include <config.h>
     25 #include <limits.h>             // UCHAR_MAX
     26 #include <stdint.h>             // int32_t
     27 
     28 namespace open_vcdiff {
     29 
     30 enum VCDiffResult {
     31   RESULT_SUCCESS = 0,
     32   // Many functions within open-vcdiff return signed integer types,
     33   // and can also return either of these special negative values:
     34   //
     35   // An error occurred while performing the requested operation.
     36   RESULT_ERROR = -1,
     37   // The end of available data was reached
     38   // before the requested operation could be completed.
     39   RESULT_END_OF_DATA = -2
     40 };
     41 
     42 // The delta file header section as described in section 4.1 of the RFC:
     43 //
     44 //    "Each delta file starts with a header section organized as below.
     45 //     Note the convention that square-brackets enclose optional items.
     46 //
     47 //           Header1                                  - byte = 0xD6
     48 //           Header2                                  - byte = 0xC3
     49 //           Header3                                  - byte = 0xC4
     50 //           Header4                                  - byte
     51 //           Hdr_Indicator                            - byte
     52 //           [Secondary compressor ID]                - byte
     53 //           [Length of code table data]              - integer
     54 //           [Code table data]
     55 //
     56 //     The first three Header bytes are the ASCII characters 'V', 'C' and
     57 //     'D' with their most significant bits turned on (in hexadecimal, the
     58 //     values are 0xD6, 0xC3, and 0xC4).  The fourth Header byte is
     59 //     currently set to zero.  In the future, it might be used to indicate
     60 //     the version of Vcdiff."
     61 //
     62 typedef struct DeltaFileHeader {
     63   unsigned char header1;  // Always 0xD6 ('V' | 0x80)
     64   unsigned char header2;  // Always 0xC3 ('C' | 0x80)
     65   unsigned char header3;  // Always 0xC4 ('D' | 0x80)
     66   unsigned char header4;  // 0x00 for standard format, 'S' if extensions used
     67   unsigned char hdr_indicator;
     68 } DeltaFileHeader;
     69 
     70 // The possible values for the Hdr_Indicator field, as described
     71 // in section 4.1 of the RFC:
     72 //
     73 //    "The Hdr_Indicator byte shows if there is any initialization data
     74 //     required to aid in the reconstruction of data in the Window sections.
     75 //     This byte MAY have non-zero values for either, both, or neither of
     76 //     the two bits VCD_DECOMPRESS and VCD_CODETABLE below:
     77 //
     78 //         7 6 5 4 3 2 1 0
     79 //        +-+-+-+-+-+-+-+-+
     80 //        | | | | | | | | |
     81 //        +-+-+-+-+-+-+-+-+
     82 //                     ^ ^
     83 //                     | |
     84 //                     | +-- VCD_DECOMPRESS
     85 //                     +---- VCD_CODETABLE
     86 //
     87 //     If bit 0 (VCD_DECOMPRESS) is non-zero, this indicates that a
     88 //     secondary compressor may have been used to further compress certain
     89 //     parts of the delta encoding data [...]"
     90 // [Secondary compressors are not supported by open-vcdiff.]
     91 //
     92 //    "If bit 1 (VCD_CODETABLE) is non-zero, this indicates that an
     93 //     application-defined code table is to be used for decoding the delta
     94 //     instructions. [...]"
     95 //
     96 const unsigned char VCD_DECOMPRESS = 0x01;
     97 const unsigned char VCD_CODETABLE = 0x02;
     98 
     99 // The possible values for the Win_Indicator field, as described
    100 // in section 4.2 of the RFC:
    101 //
    102 //    "Win_Indicator:
    103 //
    104 //     This byte is a set of bits, as shown:
    105 //
    106 //      7 6 5 4 3 2 1 0
    107 //     +-+-+-+-+-+-+-+-+
    108 //     | | | | | | | | |
    109 //     +-+-+-+-+-+-+-+-+
    110 //                  ^ ^
    111 //                  | |
    112 //                  | +-- VCD_SOURCE
    113 //                  +---- VCD_TARGET
    114 //
    115 //     If bit 0 (VCD_SOURCE) is non-zero, this indicates that a
    116 //     segment of data from the "source" file was used as the
    117 //     corresponding source window of data to encode the target
    118 //     window.  The decoder will use this same source data segment to
    119 //     decode the target window.
    120 //
    121 //     If bit 1 (VCD_TARGET) is non-zero, this indicates that a
    122 //     segment of data from the "target" file was used as the
    123 //     corresponding source window of data to encode the target
    124 //     window.  As above, this same source data segment is used to
    125 //     decode the target window.
    126 //
    127 //     The Win_Indicator byte MUST NOT have more than one of the bits
    128 //     set (non-zero).  It MAY have none of these bits set."
    129 //
    130 const unsigned char VCD_SOURCE = 0x01;
    131 const unsigned char VCD_TARGET = 0x02;
    132 // If this flag is set, the delta window includes an Adler32 checksum
    133 // of the target window data.  Not part of the RFC draft standard.
    134 const unsigned char VCD_CHECKSUM = 0x04;
    135 
    136 // The possible values for the Delta_Indicator field, as described
    137 // in section 4.3 of the RFC:
    138 //
    139 //    "Delta_Indicator:
    140 //     This byte is a set of bits, as shown:
    141 //
    142 //      7 6 5 4 3 2 1 0
    143 //     +-+-+-+-+-+-+-+-+
    144 //     | | | | | | | | |
    145 //     +-+-+-+-+-+-+-+-+
    146 //                ^ ^ ^
    147 //                | | |
    148 //                | | +-- VCD_DATACOMP
    149 //                | +---- VCD_INSTCOMP
    150 //                +------ VCD_ADDRCOMP
    151 //
    152 //          VCD_DATACOMP:   bit value 1.
    153 //          VCD_INSTCOMP:   bit value 2.
    154 //          VCD_ADDRCOMP:   bit value 4.
    155 //
    156 //     [...] If the bit VCD_DECOMPRESS (Section 4.1) was on, each of these
    157 //     sections may have been compressed using the specified secondary
    158 //     compressor.  The bit positions 0 (VCD_DATACOMP), 1
    159 //     (VCD_INSTCOMP), and 2 (VCD_ADDRCOMP) respectively indicate, if
    160 //     non-zero, that the corresponding parts are compressed."
    161 // [Secondary compressors are not supported, so open-vcdiff decoding will fail
    162 //  if these bits are not all zero.]
    163 //
    164 const unsigned char VCD_DATACOMP = 0x01;
    165 const unsigned char VCD_INSTCOMP = 0x02;
    166 const unsigned char VCD_ADDRCOMP = 0x04;
    167 
    168 // A COPY address has 32 bits, which places a limit
    169 // of 2GB on the maximum combined size of the dictionary plus
    170 // the target window (= the chunk of data to be encoded.)
    171 typedef int32_t VCDAddress;
    172 
    173 // The address modes used for COPY instructions, as defined in
    174 // section 5.3 of the RFC.
    175 //
    176 // The first two modes (0 and 1) are defined as SELF (addressing forward
    177 // from the beginning of the source window) and HERE (addressing backward
    178 // from the current position in the source window + previously decoded
    179 // target data.)
    180 //
    181 // After those first two modes, there are a variable number of NEAR modes
    182 // (which take a recently-used address and add a positive offset to it)
    183 // and SAME modes (which match a previously-used address using a "hash" of
    184 // the lowest bits of the address.)  The number of NEAR and SAME modes
    185 // depends on the defined size of the address cache; since this number is
    186 // variable, these modes cannot be specified as enum values.
    187 enum VCDiffModes {
    188   VCD_SELF_MODE = 0,
    189   VCD_HERE_MODE = 1,
    190   VCD_FIRST_NEAR_MODE = 2,
    191   VCD_MAX_MODES = UCHAR_MAX + 1  // 256
    192 };
    193 
    194 }  // namespace open_vcdiff
    195 
    196 #endif  // OPEN_VCDIFF_VCDIFF_DEFS_H_
    197