wrap vendored zstd seekable in own file, #2

laumann
May 13, 2023, 10:34 AM
L3HKOF4WYZZLJJY2Q6YJ65WGAB74GQ2A7ICD23M5NQGBP4BXF6DQC

Dependencies

  • [2] CYS4NENL move zstdseek files to vendor/zstdseek
  • [3] XTKRT6OQ format the codebase
  • [4] XJ2PEH74 add meson.build
  • [5] RIWSVVAS change: decompress the 'contents' with zstd_seekable
  • [6] OBKF6SII change: decompress the hashed section too
  • [7] KEC3WLFN change: remove debugging lines
  • [8] 2C2EF2GK move blake3 files to vendor/blake3
  • [9] Y26WT3ZF change: decode message, description and timestamp
  • [10] KDJUAAAL change: prefix function names with change_
  • [11] NZNIG2UL Fix lots of warnings, adjust build flags
  • [12] Q7TKZCJP Add initial support for reading the offsets from a (fixed) change
  • [13] 2U7P5SFQ Change struct names "struct foo -> typedef struct Foo"
  • [14] WMFNGOYT change: reduce printed noise, rework some code
  • [15] U3JWO63Y change: deduplicate some code repetition
  • [*] PEUS54XQ

Change contents

  • file addition: zstdseek.h (----------)
    [17.1]
    #ifndef ANI_ZSTDSEEK_H
    #define ANI_ZSTDSEEK_H
    /* Wrapper layer for working with the seekable variant of zstd. */
    size_t zstdseek_decompress(uint8_t *, size_t, uint8_t *, size_t);
    #endif
  • file addition: zstdseek.c (----------)
    [17.1]
    #include <stdint.h>
    #include <stdio.h>
    #include <zstd.h>
    #include "zstdseek.h"
    #include "vendor/zstdseek/zstd_seekable.h"
    /**
    * Returns zero if decompression fails, non-zero otherwise.
    */
    size_t
    zstdseek_decompress(
    uint8_t *dest, size_t expected_len, uint8_t *compressed,
    size_t compressed_len
    )
    {
    ZSTD_seekable *zs;
    size_t result;
    result = 0;
    zs = ZSTD_seekable_create();
    if (zs == NULL) {
    fprintf(stderr, "ZSTD_seekable_create() failed");
    goto out;
    }
    result = ZSTD_seekable_initBuff(zs, compressed, compressed_len);
    if (ZSTD_isError(result)) {
    fprintf(stderr, "ZSTD_seekable_init() error: %s\n",
    ZSTD_getErrorName(result));
    result = 0;
    goto outfreezs;
    }
    result = ZSTD_seekable_decompress(zs, dest, expected_len, 0);
    printf("decompress result: %lu\n", result);
    if (ZSTD_isError(result)) {
    fprintf(stderr, "ZSTD_seekable_decompress() error: %s\n",
    ZSTD_getErrorName(result));
    result = 0;
    goto outfreezs;
    }
    if (result != expected_len) {
    fprintf(stderr, "decoded %lu bytes, wanted %lu\n", result,
    expected_len);
    result = 0;
    }
    outfreezs:
    ZSTD_seekable_free(zs);
    out:
    return result;
    }
  • replacement in meson.build at line 29
    [4.346][4.346:357]()
    'hunk.c'
    [4.346]
    [4.357]
    'hunk.c',
    'zstdseek.c',
  • edit in change.c at line 8
    [5.20][5.20:38]()
    #include <zstd.h>
  • replacement in change.c at line 11
    [5.596][2.226:269]()
    #include "vendor/zstdseek/zstd_seekable.h"
    [5.596]
    [5.285666]
    #include "zstdseek.h"
  • edit in change.c at line 91
    [5.904][5.904:924]()
    ZSTD_seekable *zs;
  • replacement in change.c at line 112
    [5.1632][5.1632:1751]()
    zs = ZSTD_seekable_create();
    if (zs == NULL) {
    fprintf(stderr, "ZSTD_seekable_create() failed");
    goto errout;
    }
    [5.1632]
    [5.1751]
    result = zstdseek_decompress(
    buf, expected_len, compressed, compressed_len
    );
    if (result)
    goto out;
  • edit in change.c at line 118
    [5.1752][5.827:893](),[5.893][5.1822:1905](),[5.1822][5.1822:1905](),[5.1905][3.841:872](),[3.872][5.1937:1959](),[5.1937][5.1937:1959](),[5.1959][5.894:956](),[5.956][5.2026:2160](),[5.2026][5.2026:2160](),[5.2160][3.873:904](),[3.904][5.2192:2213](),[5.2192][5.2192:2213](),[5.2213][5.957:988](),[5.988][3.905:984](),[3.984][5.2330:2351](),[5.1064][5.2330:2351](),[5.2330][5.2330:2351](),[5.2447][5.2447:2521]()
    result = ZSTD_seekable_initBuff(zs, compressed, compressed_len);
    if (ZSTD_isError(result)) {
    fprintf(stderr, "ZSTD_seekable_init() error: %s\n",
    ZSTD_getErrorName(result));
    goto outfreezs;
    }
    result = ZSTD_seekable_decompress(zs, buf, expected_len, 0);
    printf("decompress result: %lu\n", result);
    if (ZSTD_isError(result)) {
    fprintf(stderr, "ZSTD_seekable_decompress() error: %s\n",
    ZSTD_getErrorName(result));
    goto outfreezs;
    }
    if (result != expected_len) {
    fprintf(stderr, "decoded %lu bytes, wanted %lu\n", result,
    expected_len);
    goto outfreezs;
    }
    ZSTD_seekable_free(zs);
    goto out;
    outfreezs:
    ZSTD_seekable_free(zs);