62 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| #include <openssl/objects.h>
 | |
| #include <openssl/comp.h>
 | |
| 
 | |
| static int rle_compress_block(COMP_CTX *ctx, unsigned char *out,
 | |
| 	unsigned int olen, unsigned char *in, unsigned int ilen);
 | |
| static int rle_expand_block(COMP_CTX *ctx, unsigned char *out,
 | |
| 	unsigned int olen, unsigned char *in, unsigned int ilen);
 | |
| 
 | |
| static COMP_METHOD rle_method={
 | |
| 	NID_rle_compression,
 | |
| 	LN_rle_compression,
 | |
| 	NULL,
 | |
| 	NULL,
 | |
| 	rle_compress_block,
 | |
| 	rle_expand_block,
 | |
| 	NULL,
 | |
| 	};
 | |
| 
 | |
| COMP_METHOD *COMP_rle(void)
 | |
| 	{
 | |
| 	return(&rle_method);
 | |
| 	}
 | |
| 
 | |
| static int rle_compress_block(COMP_CTX *ctx, unsigned char *out,
 | |
| 	     unsigned int olen, unsigned char *in, unsigned int ilen)
 | |
| 	{
 | |
| 	/* int i; */
 | |
| 
 | |
| 	if (olen < (ilen+1))
 | |
| 		{
 | |
| 		/* ZZZZZZZZZZZZZZZZZZZZZZ */
 | |
| 		return(-1);
 | |
| 		}
 | |
| 
 | |
| 	*(out++)=0;
 | |
| 	memcpy(out,in,ilen);
 | |
| 	return(ilen+1);
 | |
| 	}
 | |
| 
 | |
| static int rle_expand_block(COMP_CTX *ctx, unsigned char *out,
 | |
| 	     unsigned int olen, unsigned char *in, unsigned int ilen)
 | |
| 	{
 | |
| 	int i;
 | |
| 
 | |
| 	if (olen < (ilen-1))
 | |
| 		{
 | |
| 		/* ZZZZZZZZZZZZZZZZZZZZZZ */
 | |
| 		return(-1);
 | |
| 		}
 | |
| 
 | |
| 	i= *(in++);
 | |
| 	if (i == 0)
 | |
| 		{
 | |
| 		memcpy(out,in,ilen-1);
 | |
| 		}
 | |
| 	return(ilen-1);
 | |
| 	}
 | |
| 
 | 
