Import LibreSSL v2.4.2 to vendor branch
[dragonfly.git] / crypto / libressl / crypto / comp / c_rle.c
blob19b5ef6a4f9fd68870571b79ff0df5d4cb8d68ed
1 /* $OpenBSD: c_rle.c,v 1.7 2014/06/12 15:49:28 deraadt Exp $ */
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <openssl/objects.h>
6 #include <openssl/comp.h>
8 static int rle_compress_block(COMP_CTX *ctx, unsigned char *out,
9 unsigned int olen, unsigned char *in, unsigned int ilen);
10 static int rle_expand_block(COMP_CTX *ctx, unsigned char *out,
11 unsigned int olen, unsigned char *in, unsigned int ilen);
13 static COMP_METHOD rle_method = {
14 .type = NID_rle_compression,
15 .name = LN_rle_compression,
16 .compress = rle_compress_block,
17 .expand = rle_expand_block
20 COMP_METHOD *
21 COMP_rle(void)
23 return (&rle_method);
26 static int
27 rle_compress_block(COMP_CTX *ctx, unsigned char *out, unsigned int olen,
28 unsigned char *in, unsigned int ilen)
31 if (ilen == 0 || olen < (ilen - 1)) {
32 return (-1);
35 *(out++) = 0;
36 memcpy(out, in, ilen);
37 return (ilen + 1);
40 static int
41 rle_expand_block(COMP_CTX *ctx, unsigned char *out, unsigned int olen,
42 unsigned char *in, unsigned int ilen)
44 int i;
46 if (olen < (ilen - 1)) {
47 return (-1);
50 i= *(in++);
51 if (i == 0) {
52 memcpy(out, in, ilen - 1);
54 return (ilen - 1);