155714Skris#include <stdio.h>
255714Skris#include <stdlib.h>
355714Skris#include <string.h>
455714Skris#include <openssl/objects.h>
555714Skris#include <openssl/comp.h>
655714Skris
755714SkrisCOMP_CTX *COMP_CTX_new(COMP_METHOD *meth)
8280304Sjkim{
9280304Sjkim    COMP_CTX *ret;
1055714Skris
11280304Sjkim    if ((ret = (COMP_CTX *)OPENSSL_malloc(sizeof(COMP_CTX))) == NULL) {
12280304Sjkim        /* ZZZZZZZZZZZZZZZZ */
13280304Sjkim        return (NULL);
14280304Sjkim    }
15280304Sjkim    memset(ret, 0, sizeof(COMP_CTX));
16280304Sjkim    ret->meth = meth;
17280304Sjkim    if ((ret->meth->init != NULL) && !ret->meth->init(ret)) {
18280304Sjkim        OPENSSL_free(ret);
19280304Sjkim        ret = NULL;
20280304Sjkim    }
21280304Sjkim    return (ret);
22280304Sjkim}
2355714Skris
2455714Skrisvoid COMP_CTX_free(COMP_CTX *ctx)
25280304Sjkim{
26280304Sjkim    if (ctx == NULL)
27280304Sjkim        return;
2855714Skris
29280304Sjkim    if (ctx->meth->finish != NULL)
30280304Sjkim        ctx->meth->finish(ctx);
3155714Skris
32280304Sjkim    OPENSSL_free(ctx);
33280304Sjkim}
3455714Skris
3555714Skrisint COMP_compress_block(COMP_CTX *ctx, unsigned char *out, int olen,
36280304Sjkim                        unsigned char *in, int ilen)
37280304Sjkim{
38280304Sjkim    int ret;
39280304Sjkim    if (ctx->meth->compress == NULL) {
40280304Sjkim        /* ZZZZZZZZZZZZZZZZZ */
41280304Sjkim        return (-1);
42280304Sjkim    }
43280304Sjkim    ret = ctx->meth->compress(ctx, out, olen, in, ilen);
44280304Sjkim    if (ret > 0) {
45280304Sjkim        ctx->compress_in += ilen;
46280304Sjkim        ctx->compress_out += ret;
47280304Sjkim    }
48280304Sjkim    return (ret);
49280304Sjkim}
5055714Skris
5155714Skrisint COMP_expand_block(COMP_CTX *ctx, unsigned char *out, int olen,
52280304Sjkim                      unsigned char *in, int ilen)
53280304Sjkim{
54280304Sjkim    int ret;
5555714Skris
56280304Sjkim    if (ctx->meth->expand == NULL) {
57280304Sjkim        /* ZZZZZZZZZZZZZZZZZ */
58280304Sjkim        return (-1);
59280304Sjkim    }
60280304Sjkim    ret = ctx->meth->expand(ctx, out, olen, in, ilen);
61280304Sjkim    if (ret > 0) {
62280304Sjkim        ctx->expand_in += ilen;
63280304Sjkim        ctx->expand_out += ret;
64280304Sjkim    }
65280304Sjkim    return (ret);
66280304Sjkim}
67