]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/zstd/tests/longmatch.c
Import zstandard 1.1.4 in base
[FreeBSD/FreeBSD.git] / contrib / zstd / tests / longmatch.c
1 #include <stdio.h>
2 #include <stddef.h>
3 #include <stdlib.h>
4 #include <stdint.h>
5 #include "mem.h"
6 #define ZSTD_STATIC_LINKING_ONLY
7 #include "zstd.h"
8
9 int compress(ZSTD_CStream *ctx, ZSTD_outBuffer out, const void *data, size_t size) {
10   ZSTD_inBuffer in = { data, size, 0 };
11   while (in.pos < in.size) {
12     ZSTD_outBuffer tmp = out;
13     const size_t rc = ZSTD_compressStream(ctx, &tmp, &in);
14     if (ZSTD_isError(rc)) {
15       return 1;
16     }
17   }
18   {
19     ZSTD_outBuffer tmp = out;
20     const size_t rc = ZSTD_flushStream(ctx, &tmp);
21     if (rc != 0) { return 1; }
22   }
23   return 0;
24 }
25
26 int main(int argc, const char** argv) {
27   ZSTD_CStream *ctx;
28   ZSTD_parameters params;
29   size_t rc;
30   unsigned windowLog;
31   (void)argc;
32   (void)argv;
33   /* Create stream */
34   ctx = ZSTD_createCStream();
35   if (!ctx) { return 1; }
36   /* Set parameters */
37   memset(&params, 0, sizeof(params));
38   params.cParams.windowLog = 18;
39   params.cParams.chainLog = 13;
40   params.cParams.hashLog = 14;
41   params.cParams.searchLog = 1;
42   params.cParams.searchLength = 7;
43   params.cParams.targetLength = 16;
44   params.cParams.strategy = ZSTD_fast;
45   windowLog = params.cParams.windowLog;
46   /* Initialize stream */
47   rc = ZSTD_initCStream_advanced(ctx, NULL, 0, params, 0);
48   if (ZSTD_isError(rc)) { return 2; }
49   {
50     U64 compressed = 0;
51     const U64 toCompress = ((U64)1) << 33;
52     const size_t size = 1 << windowLog;
53     size_t pos = 0;
54     char *srcBuffer = (char*) malloc(1 << windowLog);
55     char *dstBuffer = (char*) malloc(ZSTD_compressBound(1 << windowLog));
56     ZSTD_outBuffer out = { dstBuffer, ZSTD_compressBound(1 << windowLog), 0 };
57     const char match[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
58     const size_t randomData = (1 << windowLog) - 2*sizeof(match);
59     size_t i;
60     printf("\n ===   Long Match Test   === \n");
61     printf("Creating random data to produce long matches \n");
62     for (i = 0; i < sizeof(match); ++i) {
63       srcBuffer[i] = match[i];
64     }
65     for (i = 0; i < randomData; ++i) {
66       srcBuffer[sizeof(match) + i] = (char)(rand() & 0xFF);
67     }
68     for (i = 0; i < sizeof(match); ++i) {
69       srcBuffer[sizeof(match) + randomData + i] = match[i];
70     }
71     printf("Compressing, trying to generate a segfault \n");
72     if (compress(ctx, out, srcBuffer, size)) {
73       return 1;
74     }
75     compressed += size;
76     while (compressed < toCompress) {
77       const size_t block = rand() % (size - pos + 1);
78       if (pos == size) { pos = 0; }
79       if (compress(ctx, out, srcBuffer + pos, block)) {
80         return 1;
81       }
82       pos += block;
83       compressed += block;
84     }
85     printf("Compression completed successfully (no error triggered)\n");
86     free(srcBuffer);
87     free(dstBuffer);
88   }
89   return 0;
90 }