[MKHIVE] Remove key name in our custom registry tree; use cell index instead
[reactos.git] / reactos / tools / bin2c.c
index c5dd074..61b78ef 100644 (file)
-#include <stdio.h>
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS bin2c
+ * FILE:            tools/bin2c/bin2c.c
+ * PURPOSE:         Converts a binary file into a byte array
+ * PROGRAMMER:      Hermès Bélusca - Maïto
+ */
 
-FILE   *in;
-FILE   *out;
+#include <stdio.h>
 
 int main(int argc, char *argv[])
 {
-       unsigned char   ch;
-       int                             cnt = 0;
-
-       if (argc < 4)
-       {
-               printf("usage: bin2c infile.bin outfile.h array_name\n");
-               return -1;
-       }
-
-       if ((in = fopen(argv[1], "rb")) == NULL)
-       {
-               printf("Couldn't open data file.\n");
-               return -1;
-       }
-       if ((out = fopen(argv[2], "wb")) == NULL)
-       {
-               printf("Couldn't open output file.\n");
-               return -1;
-       }
-
-       fprintf(out, "unsigned char %s[] = {\n", argv[3]);
-
-       ch = fgetc(in);
-       while (!feof(in))
-       {
-               if (cnt != 0)
-                       fprintf(out, ", ");
-               if (!(cnt % 16))
-                       fprintf(out, "\n");
-               fprintf(out, "0x%02x", (int)ch);
-               cnt++;
-               ch = fgetc(in);
-       }
-
-       fprintf(out, "\n};\n");
-
-       fclose(in);
-       fclose(out);
-
-       return 0;
+    FILE* inFile;
+    FILE* outCFile;
+    FILE* outHFile;
+    unsigned char ch;
+    unsigned char cnt;
+
+    /*
+     * Validate the arguments.
+     */
+    if (argc < 5)
+    {
+        printf("Usage: bin2c infile.bin outfile.c outfile.h array_name [array_attribute [header_for_attribute]]\n");
+        return -1;
+    }
+
+    /*
+     * Open the input and the output files.
+     */
+    inFile = fopen(argv[1], "rb");
+    if (!inFile)
+    {
+        printf("ERROR: Couldn't open data file '%s'.\n", argv[1]);
+        return -1;
+    }
+    outCFile = fopen(argv[2], "w");
+    if (!outCFile)
+    {
+        fclose(inFile);
+        printf("ERROR: Couldn't create output source file '%s'.\n", argv[2]);
+        return -1;
+    }
+    outHFile = fopen(argv[3], "w");
+    if (!outHFile)
+    {
+        fclose(outCFile);
+        fclose(inFile);
+        printf("ERROR: Couldn't create output header file '%s'.\n", argv[3]);
+        return -1;
+    }
+
+    /*
+     * Generate the header file and close it.
+     */
+    fprintf(outHFile, "/* This file is autogenerated, do not edit. */\n\n");
+    fprintf(outHFile, "#ifndef CHAR\n"
+                      "#define CHAR char\n"
+                      "#endif\n\n");
+    fprintf(outHFile, "extern CHAR %s[];\n", argv[4]);
+    fclose(outHFile);
+
+    /*
+     * Generate the source file and close it.
+     */
+    fprintf(outCFile, "/* This file is autogenerated, do not edit. */\n\n");
+    if (argc >= 7)
+    {
+        /* There is a header to be included for defining the array attribute. */
+        fprintf(outCFile, "#include \"%s\"\n", argv[6]);
+    }
+    fprintf(outCFile, "#include \"%s\"\n\n", argv[3]);
+
+    /* Generate the array. */
+    if (argc >= 6)
+    {
+        /* There is an array attribute. */
+        fprintf(outCFile, "%s ", argv[5]);
+    }
+    fprintf(outCFile, "CHAR %s[] =\n{", argv[4]);
+
+    cnt = 0;
+    ch  = fgetc(inFile);
+    while (!feof(inFile))
+    {
+        if ((cnt % 16) == 0)
+        {
+            fprintf(outCFile, "\n   ");
+            cnt = 0;
+        }
+        fprintf(outCFile, " 0x%02x,", (unsigned int)ch);
+        ++cnt;
+        ch = fgetc(inFile);
+    }
+    /* Put a final NULL terminator. */
+    fprintf(outCFile, "\n    0x00");
+    fprintf(outCFile, "\n};\n");
+    fclose(outCFile);
+
+    /* Close the input file. */
+    fclose(inFile);
+
+    return 0;
 }
+
+/* EOF */