ReactOS 0.4.15-dev-7942-gd23573b
bin2c.c File Reference
#include <stdio.h>
#include <strings.h>
Include dependency graph for bin2c.c:

Go to the source code of this file.

Macros

#define _stricmp   strcasecmp
 

Functions

static size_t dumpHex (FILE *inFile, FILE *outCFile, char nullTerminate)
 
static size_t dumpStr (FILE *inFile, FILE *outCFile)
 
static void usage (char *name)
 
int main (int argc, char *argv[])
 

Macro Definition Documentation

◆ _stricmp

#define _stricmp   strcasecmp

Definition at line 15 of file bin2c.c.

Function Documentation

◆ dumpHex()

static size_t dumpHex ( FILE inFile,
FILE outCFile,
char  nullTerminate 
)
static

Definition at line 18 of file bin2c.c.

19{
20 size_t bufLen = 0;
21 unsigned char ch;
22
23 fprintf(outCFile, "\n{");
24 do
25 {
26 /* Read the next byte */
27 ch = fgetc(inFile);
28
29 if (feof(inFile) && nullTerminate)
30 ch = 0x00;
31
32 if (!feof(inFile) || nullTerminate)
33 {
34 /* Start a new line if needed */
35 if ((bufLen % 16) == 0)
36 fprintf(outCFile, "\n ");
37
38 /* Write the byte or the optional NULL terminator */
39 fprintf(outCFile, " 0x%02x,", (unsigned int)ch);
40
41 ++bufLen;
42 }
43 } while (!feof(inFile));
44 fprintf(outCFile, "\n}");
45
46 return bufLen;
47}
_Check_return_opt_ _CRTIMP int __cdecl fgetc(_Inout_ FILE *_File)
_Check_return_ _CRTIMP int __cdecl feof(_In_ FILE *_File)
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)

Referenced by main().

◆ dumpStr()

static size_t dumpStr ( FILE inFile,
FILE outCFile 
)
static

Definition at line 49 of file bin2c.c.

50{
51 size_t bufLen = 0;
52 unsigned char ch;
53
54 /* Always start the first line */
55 fprintf(outCFile, "\n \"");
56 do
57 {
58 /* Read the next byte */
59 ch = fgetc(inFile);
60
61 /* If a byte is available... */
62 if (!feof(inFile))
63 {
64 /* ... do we need to start a new line? */
65 if ((bufLen != 0) && (bufLen % 16) == 0)
66 {
67 /* Yes, end the current line and start a new one */
68 fprintf(outCFile, "\"");
69 fprintf(outCFile, "\n \"");
70 }
71
72 /* Now write the byte */
73 fprintf(outCFile, "\\x%02x", (unsigned int)ch);
74 }
75 /* ... otherwise, end the current line... */
76 else
77 {
78 fprintf(outCFile, "\"");
79 /* We break just after */
80 }
81
82 ++bufLen; // This takes also the final NULL terminator into account.
83
84 } while (!feof(inFile));
85
86 return bufLen;
87}

Referenced by main().

◆ main()

int main ( int argc  ,
char argv[] 
)

Definition at line 94 of file bin2c.c.

95{
96 FILE* inFile;
97 FILE* outCFile;
98 FILE* outHFile;
99 size_t bufLen;
100
101 /* Validate the arguments */
102 if (argc < 6)
103 {
104 usage(argv[0]);
105 return -1;
106 }
107
108 /* Verify the output format */
109 if (_stricmp(argv[4], "BIN" ) != 0 &&
110 _stricmp(argv[4], "BINSTR") != 0 &&
111 _stricmp(argv[4], "STR" ) != 0)
112 {
113 usage(argv[0]);
114 return -1;
115 }
116
117 /* Open the input and output files */
118 inFile = fopen(argv[1], "rb");
119 if (!inFile)
120 {
121 fprintf(stderr, "ERROR: Couldn't open data file '%s'.\n", argv[1]);
122 return -1;
123 }
124 outCFile = fopen(argv[2], "w");
125 if (!outCFile)
126 {
127 fclose(inFile);
128 fprintf(stderr, "ERROR: Couldn't create output source file '%s'.\n", argv[2]);
129 return -1;
130 }
131 outHFile = fopen(argv[3], "w");
132 if (!outHFile)
133 {
134 fclose(outCFile);
135 fclose(inFile);
136 fprintf(stderr, "ERROR: Couldn't create output header file '%s'.\n", argv[3]);
137 return -1;
138 }
139
140 /* Generate the source file and close it */
141 fprintf(outCFile, "/* This file is autogenerated, do not edit. */\n\n");
142 if (argc >= 8)
143 {
144 /* Include needed header for defining the array attribute */
145 fprintf(outCFile, "#include \"%s\"\n", argv[7]);
146 }
147 fprintf(outCFile, "#include \"%s\"\n\n", argv[3]);
148
149 /* Generate the data array */
150 if (argc >= 7)
151 {
152 /* Add the array attribute */
153 fprintf(outCFile, "%s ", argv[6]);
154 }
155 fprintf(outCFile, "unsigned char %s[] =", argv[5]);
156
157 /* Output the bytes in the chosen format */
158 if (_stricmp(argv[4], "BIN") == 0)
159 bufLen = dumpHex(inFile, outCFile, 0);
160 else if (_stricmp(argv[4], "BINSTR") == 0)
161 bufLen = dumpHex(inFile, outCFile, 1);
162 else // (_stricmp(argv[4], "STR") == 0)
163 bufLen = dumpStr(inFile, outCFile);
164
165 fprintf(outCFile, ";\n");
166 fclose(outCFile);
167
168 /* Generate the header file and close it */
169 fprintf(outHFile, "/* This file is autogenerated, do not edit. */\n\n");
170 fprintf(outHFile, "#define %s_SIZE %lu\n" , argv[5], (unsigned long)bufLen);
171 fprintf(outHFile, "extern unsigned char %s[%lu];\n", argv[5], (unsigned long)bufLen);
172 fclose(outHFile);
173
174 /* Close the input file */
175 fclose(inFile);
176
177 return 0;
178}
static int argc
Definition: ServiceArgs.c:12
#define _stricmp
Definition: bin2c.c:15
static size_t dumpHex(FILE *inFile, FILE *outCFile, char nullTerminate)
Definition: bin2c.c:18
static size_t dumpStr(FILE *inFile, FILE *outCFile)
Definition: bin2c.c:49
GLsizeiptr const GLvoid GLenum usage
Definition: glext.h:5919
#define stderr
Definition: stdio.h:100
_Check_return_ _CRTIMP FILE *__cdecl fopen(_In_z_ const char *_Filename, _In_z_ const char *_Mode)
_Check_return_opt_ _CRTIMP int __cdecl fclose(_Inout_ FILE *_File)
#define argv
Definition: mplay32.c:18

◆ usage()

static void usage ( char name)
static

Definition at line 89 of file bin2c.c.

90{
91 fprintf(stdout, "Usage: %s infile.bin outfile.c outfile.h [BIN|BINSTR|STR] array_name [array_attribute [header_for_attribute]]\n", name);
92}
#define stdout
Definition: stdio.h:99
Definition: name.c:39