1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h>
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdlib.h>
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <string.h>
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/objects.h>
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/comp.h>
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int rle_compress_block(COMP_CTX *ctx, unsigned char *out,
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned int olen, unsigned char *in, unsigned int ilen);
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int rle_expand_block(COMP_CTX *ctx, unsigned char *out,
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned int olen, unsigned char *in, unsigned int ilen);
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic COMP_METHOD rle_method={
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	NID_rle_compression,
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	LN_rle_compression,
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	NULL,
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	NULL,
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	rle_compress_block,
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	rle_expand_block,
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	NULL,
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	NULL,
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	};
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectCOMP_METHOD *COMP_rle(void)
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(&rle_method);
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int rle_compress_block(COMP_CTX *ctx, unsigned char *out,
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     unsigned int olen, unsigned char *in, unsigned int ilen)
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* int i; */
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
33392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	if (ilen == 0 || olen < (ilen-1))
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* ZZZZZZZZZZZZZZZZZZZZZZ */
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(-1);
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	*(out++)=0;
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memcpy(out,in,ilen);
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ilen+1);
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int rle_expand_block(COMP_CTX *ctx, unsigned char *out,
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     unsigned int olen, unsigned char *in, unsigned int ilen)
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
49392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	if (olen < (ilen-1))
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* ZZZZZZZZZZZZZZZZZZZZZZ */
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(-1);
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i= *(in++);
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (i == 0)
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memcpy(out,in,ilen-1);
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ilen-1);
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
62