155714Skris#include <stdio.h>
255714Skris#include <stdlib.h>
355714Skris#include <string.h>
455714Skris#include <openssl/objects.h>
555714Skris#include <openssl/comp.h>
655714Skris
755714Skrisstatic int rle_compress_block(COMP_CTX *ctx, unsigned char *out,
855714Skris	unsigned int olen, unsigned char *in, unsigned int ilen);
955714Skrisstatic int rle_expand_block(COMP_CTX *ctx, unsigned char *out,
1055714Skris	unsigned int olen, unsigned char *in, unsigned int ilen);
1155714Skris
1255714Skrisstatic COMP_METHOD rle_method={
1355714Skris	NID_rle_compression,
1455714Skris	LN_rle_compression,
1555714Skris	NULL,
1655714Skris	NULL,
1755714Skris	rle_compress_block,
1855714Skris	rle_expand_block,
1955714Skris	NULL,
20109998Smarkm	NULL,
2155714Skris	};
2255714Skris
2355714SkrisCOMP_METHOD *COMP_rle(void)
2455714Skris	{
2555714Skris	return(&rle_method);
2655714Skris	}
2755714Skris
2855714Skrisstatic int rle_compress_block(COMP_CTX *ctx, unsigned char *out,
2955714Skris	     unsigned int olen, unsigned char *in, unsigned int ilen)
3055714Skris	{
3155714Skris	/* int i; */
3255714Skris
33238405Sjkim	if (ilen == 0 || olen < (ilen-1))
3455714Skris		{
3555714Skris		/* ZZZZZZZZZZZZZZZZZZZZZZ */
3655714Skris		return(-1);
3755714Skris		}
3855714Skris
3955714Skris	*(out++)=0;
4055714Skris	memcpy(out,in,ilen);
4155714Skris	return(ilen+1);
4255714Skris	}
4355714Skris
4455714Skrisstatic int rle_expand_block(COMP_CTX *ctx, unsigned char *out,
4555714Skris	     unsigned int olen, unsigned char *in, unsigned int ilen)
4655714Skris	{
4755714Skris	int i;
4855714Skris
49238405Sjkim	if (olen < (ilen-1))
5055714Skris		{
5155714Skris		/* ZZZZZZZZZZZZZZZZZZZZZZ */
5255714Skris		return(-1);
5355714Skris		}
5455714Skris
5555714Skris	i= *(in++);
5655714Skris	if (i == 0)
5755714Skris		{
5855714Skris		memcpy(out,in,ilen-1);
5955714Skris		}
6055714Skris	return(ilen-1);
6155714Skris	}
62