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; } | ||||
| }; | ||||
| 
 | ||||
| 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) | ||||
| { | ||||
|     LzmaStream strm; | ||||
|  |  | |||
|  | @ -4,6 +4,8 @@ | |||
| 
 | ||||
| namespace nix { | ||||
| 
 | ||||
| std::string compressXZ(const std::string & in); | ||||
| 
 | ||||
| std::string decompressXZ(const std::string & in); | ||||
| 
 | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue