94 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Copyright (c) 2019 CTCaer
 | 
						|
 *
 | 
						|
 * This program is free software; you can redistribute it and/or modify it
 | 
						|
 * under the terms and conditions of the GNU General Public License,
 | 
						|
 * version 2, as published by the Free Software Foundation.
 | 
						|
 *
 | 
						|
 * This program is distributed in the hope it will be useful, but WITHOUT
 | 
						|
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 | 
						|
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 | 
						|
 * more details.
 | 
						|
 *
 | 
						|
 * You should have received a copy of the GNU General Public License
 | 
						|
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
						|
 */
 | 
						|
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <stdint.h>
 | 
						|
#include <string.h>
 | 
						|
#include <sys/stat.h>
 | 
						|
#include "lz.h"
 | 
						|
 | 
						|
char filename[1024];
 | 
						|
 | 
						|
int main(int argc, char *argv[])
 | 
						|
{
 | 
						|
	int nbytes;
 | 
						|
	int filename_len;
 | 
						|
	struct stat statbuf;
 | 
						|
	FILE *in_file, *out_file;
 | 
						|
 | 
						|
	if(stat(argv[1], &statbuf))
 | 
						|
		goto error;
 | 
						|
 | 
						|
	if((in_file=fopen(argv[1], "rb")) == NULL)
 | 
						|
		goto error;
 | 
						|
 | 
						|
	strcpy(filename, argv[1]);
 | 
						|
	filename_len = strlen(filename);
 | 
						|
 | 
						|
	uint32_t in_size = statbuf.st_size;
 | 
						|
	uint8_t *in_buf  = (uint8_t *)malloc(in_size);
 | 
						|
 | 
						|
	uint32_t out_size = statbuf.st_size + 257;
 | 
						|
	uint8_t *out_buf = (uint8_t *)malloc(out_size);
 | 
						|
 | 
						|
	if(!(in_buf && out_buf))
 | 
						|
		goto error;
 | 
						|
 | 
						|
	if(fread(in_buf, 1, in_size, in_file) != in_size)
 | 
						|
		goto error;
 | 
						|
 | 
						|
	fclose(in_file);
 | 
						|
 | 
						|
	uint32_t *work = (uint32_t*)malloc(sizeof(uint32_t) * (in_size + 65536));
 | 
						|
	for (int i = 0; i < 2; i++)
 | 
						|
	{
 | 
						|
		uint32_t in_size_tmp;
 | 
						|
		if (!i)
 | 
						|
		{
 | 
						|
			in_size_tmp = in_size / 2;
 | 
						|
			strcpy(filename + filename_len, ".00.lz");
 | 
						|
		}
 | 
						|
		else
 | 
						|
		{
 | 
						|
			in_size_tmp = in_size - (in_size / 2);
 | 
						|
			strcpy(filename + filename_len, ".01.lz");
 | 
						|
		}
 | 
						|
 | 
						|
		if (work)
 | 
						|
			nbytes = LZ_CompressFast(in_buf + (in_size / 2) * i, out_buf, in_size_tmp, work);
 | 
						|
		else
 | 
						|
			goto error;
 | 
						|
 | 
						|
		if (nbytes > out_size)
 | 
						|
			goto error;
 | 
						|
 | 
						|
		if((out_file = fopen(filename,"wb")) == NULL)
 | 
						|
			goto error;
 | 
						|
 | 
						|
		if (fwrite(out_buf, 1, nbytes, out_file) != nbytes)
 | 
						|
			goto error;
 | 
						|
 | 
						|
		fclose(out_file);
 | 
						|
	}
 | 
						|
 | 
						|
	return 0;
 | 
						|
 | 
						|
error:
 | 
						|
	fprintf(stderr, "Failed to compress: %s\n", argv[1]);
 | 
						|
	exit(1);
 | 
						|
}
 |