Add xz compression function
This is used by the Hydra queue runner, but since it may also be useful for the C++ rewrite of nix-push, I'm putting it here.
This commit is contained in:
		
							parent
							
								
									bfdacb712c
								
							
						
					
					
						commit
						eff5021eaa
					
				
					 2 changed files with 42 additions and 0 deletions
				
			
		|  | @ -15,6 +15,46 @@ struct LzmaStream | ||||||
|     lzma_stream & operator()() { return strm; } |     lzma_stream & operator()() { return strm; } | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | std::string compressXZ(const std::string & in) | ||||||
|  | { | ||||||
|  |     LzmaStream strm; | ||||||
|  | 
 | ||||||
|  |     // FIXME: apply the x86 BCJ filter?
 | ||||||
|  | 
 | ||||||
|  |     lzma_ret ret = lzma_easy_encoder( | ||||||
|  |         &strm(), 6, LZMA_CHECK_CRC64); | ||||||
|  |     if (ret != LZMA_OK) | ||||||
|  |         throw Error("unable to initialise lzma encoder"); | ||||||
|  | 
 | ||||||
|  |     lzma_action action = LZMA_RUN; | ||||||
|  |     uint8_t outbuf[BUFSIZ]; | ||||||
|  |     string res; | ||||||
|  |     strm().next_in = (uint8_t *) in.c_str(); | ||||||
|  |     strm().avail_in = in.size(); | ||||||
|  |     strm().next_out = outbuf; | ||||||
|  |     strm().avail_out = sizeof(outbuf); | ||||||
|  | 
 | ||||||
|  |     while (true) { | ||||||
|  | 
 | ||||||
|  |         if (strm().avail_in == 0) | ||||||
|  |             action = LZMA_FINISH; | ||||||
|  | 
 | ||||||
|  |         lzma_ret ret = lzma_code(&strm(), action); | ||||||
|  | 
 | ||||||
|  |         if (strm().avail_out == 0 || ret == LZMA_STREAM_END) { | ||||||
|  |             res.append((char *) outbuf, sizeof(outbuf) - strm().avail_out); | ||||||
|  |             strm().next_out = outbuf; | ||||||
|  |             strm().avail_out = sizeof(outbuf); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (ret == LZMA_STREAM_END) | ||||||
|  |             return res; | ||||||
|  | 
 | ||||||
|  |         if (ret != LZMA_OK) | ||||||
|  |             throw Error("error while decompressing xz file"); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| std::string decompressXZ(const std::string & in) | std::string decompressXZ(const std::string & in) | ||||||
| { | { | ||||||
|     LzmaStream strm; |     LzmaStream strm; | ||||||
|  |  | ||||||
|  | @ -4,6 +4,8 @@ | ||||||
| 
 | 
 | ||||||
| namespace nix { | namespace nix { | ||||||
| 
 | 
 | ||||||
|  | std::string compressXZ(const std::string & in); | ||||||
|  | 
 | ||||||
| std::string decompressXZ(const std::string & in); | std::string decompressXZ(const std::string & in); | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue