|
@@ -0,0 +1,106 @@
|
|
|
+/*
|
|
|
+ * 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;
|
|
|
+}
|