63 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			1.4 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,
 | 
						|
    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 (ilen == 0 || 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);
 | 
						|
}
 |