104 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
// SPDX-License-Identifier: GPL-2.0+
 | 
						|
/*
 | 
						|
 * Convert a file image to a C define
 | 
						|
 *
 | 
						|
 * Copyright (c) 2017 Heinrich Schuchardt <xypron.glpk@gmx.de>
 | 
						|
 *
 | 
						|
 * For testing EFI disk management we need an in memory image of
 | 
						|
 * a disk.
 | 
						|
 *
 | 
						|
 * The tool file2include converts a file to a C include. The file
 | 
						|
 * is separated into strings of 8 bytes. Only the non-zero strings
 | 
						|
 * are written to the include. The output format has been designed
 | 
						|
 * to maintain readability.
 | 
						|
 *
 | 
						|
 * As the disk image needed for testing contains mostly zeroes a high
 | 
						|
 * compression ratio can be attained.
 | 
						|
 */
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <stdint.h>
 | 
						|
 | 
						|
/* Size of the blocks written to the compressed file */
 | 
						|
#define BLOCK_SIZE 8
 | 
						|
 | 
						|
int main(int argc, char *argv[])
 | 
						|
{
 | 
						|
	FILE *file;
 | 
						|
	int ret;
 | 
						|
	unsigned char *buf;
 | 
						|
	size_t count, i, j;
 | 
						|
 | 
						|
	/* Provide usage help */
 | 
						|
	if (argc != 2) {
 | 
						|
		printf("Usage:\n%s FILENAME\n", argv[0]);
 | 
						|
		return EXIT_FAILURE;
 | 
						|
	}
 | 
						|
	/* Open file */
 | 
						|
	file = fopen(argv[1], "r");
 | 
						|
	if (!file) {
 | 
						|
		perror("fopen");
 | 
						|
		return EXIT_FAILURE;
 | 
						|
	}
 | 
						|
	/* Get file length */
 | 
						|
	ret = fseek(file, 0, SEEK_END);
 | 
						|
	if (ret < 0) {
 | 
						|
		perror("fseek");
 | 
						|
		return EXIT_FAILURE;
 | 
						|
	}
 | 
						|
	count = ftell(file);
 | 
						|
	if (!count) {
 | 
						|
		fprintf(stderr, "File %s has length 0\n", argv[1]);
 | 
						|
		return EXIT_FAILURE;
 | 
						|
	}
 | 
						|
	rewind(file);
 | 
						|
	/* Read file */
 | 
						|
	buf = malloc(count);
 | 
						|
	if (!buf) {
 | 
						|
		perror("calloc");
 | 
						|
		return EXIT_FAILURE;
 | 
						|
	}
 | 
						|
	count = fread(buf, 1, count, file);
 | 
						|
 | 
						|
	/* Generate output */
 | 
						|
	printf("/* SPDX-License-Identifier: GPL-2.0+ */\n");
 | 
						|
	printf("/*\n");
 | 
						|
	printf(" *  Non-zero %u byte strings of a disk image\n", BLOCK_SIZE);
 | 
						|
	printf(" *\n");
 | 
						|
	printf(" *  Generated with tools/file2include\n");
 | 
						|
	printf(" */\n\n");
 | 
						|
	printf("#define EFI_ST_DISK_IMG { 0x%08zx, { \\\n", count);
 | 
						|
 | 
						|
	for (i = 0; i < count; i += BLOCK_SIZE) {
 | 
						|
		int c = 0;
 | 
						|
 | 
						|
		for (j = i; j < i + BLOCK_SIZE && j < count; ++j) {
 | 
						|
			if (buf[j])
 | 
						|
				c = 1;
 | 
						|
		}
 | 
						|
		if (!c)
 | 
						|
			continue;
 | 
						|
		printf("\t{0x%08zx, \"", i);
 | 
						|
		for (j = i; j < i + BLOCK_SIZE && j < count; ++j)
 | 
						|
			printf("\\x%02x", buf[j]);
 | 
						|
		printf("\"}, /* ");
 | 
						|
		for (j = i; j < i + BLOCK_SIZE && j < count; ++j) {
 | 
						|
			if (buf[j] != '*' && buf[j] >= 0x20 && buf[j] <= 0x7e)
 | 
						|
				printf("%c", buf[j]);
 | 
						|
			else
 | 
						|
				printf(".");
 | 
						|
		}
 | 
						|
		printf(" */ \\\n");
 | 
						|
	}
 | 
						|
	printf("\t{0, NULL} } }\n");
 | 
						|
 | 
						|
	/* Release resources */
 | 
						|
	free(buf);
 | 
						|
	ret = fclose(file);
 | 
						|
	if (ret) {
 | 
						|
		perror("fclose");
 | 
						|
		return EXIT_FAILURE;
 | 
						|
	}
 | 
						|
	return EXIT_SUCCESS;
 | 
						|
}
 |