c_rle.c 1.4 KB

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