u-boot/tools/file2include.c
Heinrich Schuchardt ac02019616 tools: provide a tool to convert a binary file to an include
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.

 #define EFI_ST_DISK_IMG { 0x00010000, { \
  {0x000001b8, "\x94\x37\x69\xfc\x00\x00\x00\x00"}, /* .7i..... */ \
  {0x000001c0, "\x02\x00\x83\x02\x02\x00\x01\x00"}, /* ........ */ \
  {0x000001c8, "\x00\x00\x7f\x00\x00\x00\x00\x00"}, /* ........ */ \
  {0x000001f8, "\x00\x00\x00\x00\x00\x00\x55\xaa"}, /* ......U. */ \
 ...
  {0x00006000, "\x48\x65\x6c\x6c\x6f\x20\x77\x6f"}, /* Hello wo */ \
  {0x00006008, "\x72\x6c\x64\x21\x0a\x00\x00\x00"}, /* rld!.... */ \
  {0, NULL} } }

As the disk image needed for testing contains mostly zeroes a high
compression ratio can be attained.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Signed-off-by: Alexander Graf <agraf@suse.de>
2018-01-22 23:09:12 +01:00

106 lines
2.4 KiB
C

/*
* Convert a file image to a C define
*
* Copyright (c) 2017 Heinrich Schuchardt <xypron.glpk@gmx.de>
*
* SPDX-License-Identifier: GPL-2.0+
*
* 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>
#include <malloc.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("/*\n");
printf(" * Non-zero %u byte strings of a disk image\n", BLOCK_SIZE);
printf(" *\n");
printf(" * Generated with tools/file2include\n");
printf(" *\n");
printf(" * SPDX-License-Identifier: GPL-2.0+\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] >= 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;
}