Run util/openssl-format-source -v -c .
[openssl.git] / crypto / comp / c_rle.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <openssl/objects.h>
5 #include <openssl/comp.h>
6
7 static int rle_compress_block(COMP_CTX *ctx, unsigned char *out,
8                               unsigned int olen, unsigned char *in,
9                               unsigned int ilen);
10 static int rle_expand_block(COMP_CTX *ctx, unsigned char *out,
11                             unsigned int olen, unsigned char *in,
12                             unsigned int ilen);
13
14 static COMP_METHOD rle_method = {
15     NID_rle_compression,
16     LN_rle_compression,
17     NULL,
18     NULL,
19     rle_compress_block,
20     rle_expand_block,
21     NULL,
22     NULL,
23 };
24
25 COMP_METHOD *COMP_rle(void)
26 {
27     return (&rle_method);
28 }
29
30 static int rle_compress_block(COMP_CTX *ctx, unsigned char *out,
31                               unsigned int olen, unsigned char *in,
32                               unsigned int ilen)
33 {
34     /* int i; */
35
36     if (olen < (ilen + 1)) {
37         /* ZZZZZZZZZZZZZZZZZZZZZZ */
38         return (-1);
39     }
40
41     *(out++) = 0;
42     memcpy(out, in, ilen);
43     return (ilen + 1);
44 }
45
46 static int rle_expand_block(COMP_CTX *ctx, unsigned char *out,
47                             unsigned int olen, unsigned char *in,
48                             unsigned int ilen)
49 {
50     int i;
51
52     if (ilen == 0 || olen < (ilen - 1)) {
53         /* ZZZZZZZZZZZZZZZZZZZZZZ */
54         return (-1);
55     }
56
57     i = *(in++);
58     if (i == 0) {
59         memcpy(out, in, ilen - 1);
60     }
61     return (ilen - 1);
62 }