| /* |
| * diff-delta code taken from git.git. See diff-delta.c for details. |
| * |
| */ |
| #ifndef INCLUDE_git_delta_h__ |
| #define INCLUDE_git_delta_h__ |
| |
| #include "common.h" |
| #include "pack.h" |
| |
| typedef struct git_delta_index git_delta_index; |
| |
| /* |
| * git_delta_index_init: compute index data from given buffer |
| * |
| * This returns a pointer to a struct delta_index that should be passed to |
| * subsequent create_delta() calls, or to free_delta_index(). A NULL pointer |
| * is returned on failure. The given buffer must not be freed nor altered |
| * before free_delta_index() is called. The returned pointer must be freed |
| * using free_delta_index(). |
| */ |
| extern int git_delta_index_init( |
| git_delta_index **out, const void *buf, size_t bufsize); |
| |
| /* |
| * Free the index created by git_delta_index_init() |
| */ |
| extern void git_delta_index_free(git_delta_index *index); |
| |
| /* |
| * Returns memory usage of delta index. |
| */ |
| extern size_t git_delta_index_size(git_delta_index *index); |
| |
| /* |
| * create_delta: create a delta from given index for the given buffer |
| * |
| * This function may be called multiple times with different buffers using |
| * the same delta_index pointer. If max_delta_size is non-zero and the |
| * resulting delta is to be larger than max_delta_size then NULL is returned. |
| * On success, a non-NULL pointer to the buffer with the delta data is |
| * returned and *delta_size is updated with its size. The returned buffer |
| * must be freed by the caller. |
| */ |
| extern int git_delta_create_from_index( |
| void **out, |
| size_t *out_size, |
| const struct git_delta_index *index, |
| const void *buf, |
| size_t bufsize, |
| size_t max_delta_size); |
| |
| /* |
| * diff_delta: create a delta from source buffer to target buffer |
| * |
| * If max_delta_size is non-zero and the resulting delta is to be larger |
| * than max_delta_size then GIT_EBUFS is returned. On success, a non-NULL |
| * pointer to the buffer with the delta data is returned and *delta_size is |
| * updated with its size. The returned buffer must be freed by the caller. |
| */ |
| GIT_INLINE(int) git_delta( |
| void **out, size_t *out_len, |
| const void *src_buf, size_t src_bufsize, |
| const void *trg_buf, size_t trg_bufsize, |
| size_t max_delta_size) |
| { |
| git_delta_index *index; |
| int error = 0; |
| |
| *out = NULL; |
| *out_len = 0; |
| |
| if ((error = git_delta_index_init(&index, src_buf, src_bufsize)) < 0) |
| return error; |
| |
| if (index) { |
| error = git_delta_create_from_index(out, out_len, |
| index, trg_buf, trg_bufsize, max_delta_size); |
| |
| git_delta_index_free(index); |
| } |
| |
| return error; |
| } |
| |
| /* the smallest possible delta size is 4 bytes */ |
| #define GIT_DELTA_SIZE_MIN 4 |
| |
| /** |
| * Apply a git binary delta to recover the original content. |
| * The caller is responsible for freeing the returned buffer. |
| * |
| * @param out the output buffer |
| * @param out_len the length of the output buffer |
| * @param base the base to copy from during copy instructions. |
| * @param base_len number of bytes available at base. |
| * @param delta the delta to execute copy/insert instructions from. |
| * @param delta_len total number of bytes in the delta. |
| * @return 0 on success or an error code |
| */ |
| extern int git_delta_apply( |
| void **out, |
| size_t *out_len, |
| const unsigned char *base, |
| size_t base_len, |
| const unsigned char *delta, |
| size_t delta_len); |
| |
| /** |
| * Read the header of a git binary delta. |
| * |
| * @param base_out pointer to store the base size field. |
| * @param result_out pointer to store the result size field. |
| * @param delta the delta to execute copy/insert instructions from. |
| * @param delta_len total number of bytes in the delta. |
| * @return 0 on success or an error code |
| */ |
| extern int git_delta_read_header( |
| size_t *base_out, |
| size_t *result_out, |
| const unsigned char *delta, |
| size_t delta_len); |
| |
| /** |
| * Read the header of a git binary delta |
| * |
| * This variant reads just enough from the packfile stream to read the |
| * delta header. |
| */ |
| extern int git_delta_read_header_fromstream( |
| size_t *base_out, |
| size_t *result_out, |
| git_packfile_stream *stream); |
| |
| #endif |