Guest User

Untitled

a guest
Sep 25th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.56 KB | None | 0 0
  1. #include "util.hpp"
  2.  
  3. #include <Poco/File.h>
  4. #include <lzma.h>
  5. #include <vector>
  6. #include <iostream>
  7. #include <cstddef>
  8. #include <cstring>
  9. #include <cstdlib>
  10.  
  11. const uint32_t COMPRESSION_LEVEL = 6;
  12. const lzma_check INTEGRITY_CHECK = LZMA_CHECK_CRC64;
  13. const lzma_match_finder FINDER = LZMA_MF_HC4;
  14. const std::size_t BUFSIZ = 2 * 1024 * 1024;
  15.  
  16. void usage() {
  17. std::cerr << "Usage: test_lzma INFILE" << std::endl;
  18. }
  19.  
  20. int main(int argc, char** argv) {
  21. if( argc == 1 ) {
  22. usage();
  23. return 1;
  24. }
  25.  
  26. lzma_options_lzma options;
  27. lzma_lzma_preset(&options, COMPRESSION_LEVEL);
  28. options.mf = FINDER;
  29.  
  30. std::size_t ENCODED_BUFSIZ = lzma_block_buffer_bound(BUFSIZ);
  31. std::cerr << "max encoded size=" << ENCODED_BUFSIZ << std::endl;
  32.  
  33. std::vector<uint8_t> buf(BUFSIZ);
  34. uint8_t* const pBuf = &(buf[0]);
  35. std::vector<uint8_t> ebuf(ENCODED_BUFSIZ);
  36. uint8_t* const pEbuf = &(ebuf[0]);
  37.  
  38. cybozu::file f(Poco::Path(argv[1]), O_RDONLY);
  39.  
  40. #if 0
  41. lzma_filter filters[LZMA_FILTERS_MAX + 1];
  42. filters[0].id = LZMA_FILTER_LZMA2;
  43. filters[0].options = &options;
  44. filters[1].id = LZMA_VLI_UNKNOWN;
  45. filters[1].options = 0;
  46.  
  47. uint64_t memory_usage = lzma_raw_encoder_memusage(filters);
  48. if( memory_usage == UINT64_MAX ) {
  49. std::cerr << "failed to check memory usage of encoder." << std::endl;
  50. return 1;
  51. }
  52. std::cerr << "encoder mem usage=" << memory_usage << std::endl;
  53.  
  54. lzma_block block_header;
  55. std::memset(&block_header, 0, sizeof(block_header));
  56. block_header.version = 0;
  57. block_header.check = INTEGRITY_CHECK;
  58. block_header.filters = filters;
  59.  
  60. f.read(pBuf, BUFSIZ);
  61. std::size_t out_pos = 0;
  62. if( lzma_block_buffer_encode(&block_header, NULL, pBuf, BUFSIZ,
  63. pEbuf, &out_pos, ENCODED_BUFSIZ) != LZMA_OK ) {
  64. std::cerr << "failed to encode." << std::endl;
  65. return 1;
  66. }
  67. std::cerr << "encoded size=" << out_pos << std::endl;
  68. cybozu::writeall(1, pEbuf, out_pos);
  69. #else
  70. std::size_t len = (std::size_t)Poco::File(argv[1]).getSize();
  71. f.read(pEbuf, len);
  72.  
  73. lzma_filter filters[LZMA_FILTERS_MAX + 1];
  74. for( int i = 0; i < (LZMA_FILTERS_MAX+1); ++i ) {
  75. filters[i].id = LZMA_VLI_UNKNOWN;
  76. filters[i].options = 0;
  77. }
  78.  
  79. lzma_block block_header;
  80. std::memset(&block_header, 0, sizeof(block_header));
  81. block_header.version = 0;
  82. block_header.filters = filters;
  83. block_header.header_size = lzma_block_header_size_decode(pEbuf[0]);
  84. std::size_t in_pos = (std::size_t)block_header.header_size;
  85. std::cerr << "block header size=" << in_pos << std::endl;
  86. if( lzma_block_header_decode(&block_header, NULL, pEbuf) != LZMA_OK ) {
  87. std::cerr << "failed to decode header." << std::endl;
  88. return 1;
  89. }
  90.  
  91. uint64_t memory_usage = lzma_raw_decoder_memusage(filters);
  92. if( memory_usage == UINT64_MAX ) {
  93. std::cerr << "failed to check memory usage of decoder." << std::endl;
  94. return 1;
  95. }
  96. std::cerr << "decoder mem usage=" << memory_usage << std::endl;
  97.  
  98. std::size_t out_pos = 0;
  99. if( lzma_block_buffer_decode(&block_header, NULL, pEbuf, &in_pos, len,
  100. pBuf, &out_pos, BUFSIZ) != LZMA_OK ) {
  101. std::cerr << "failed to decode." << std::endl;
  102. return 1;
  103. }
  104. std::cerr << "decoded size=" << out_pos << std::endl;
  105.  
  106. for( int i = 0; i < (LZMA_FILTERS_MAX + 1); ++i ) {
  107. if( filters[i].id == LZMA_VLI_UNKNOWN ) break;
  108. std::free( filters[i].options );
  109. filters[i].options = 0;
  110. }
  111. cybozu::writeall(1, pBuf, out_pos);
  112. #endif
  113.  
  114. return 0;
  115. }
Add Comment
Please, Sign In to add comment