forked from allinurl/goaccess
-
Notifications
You must be signed in to change notification settings - Fork 0
/
bin2c.c
147 lines (127 loc) · 3.58 KB
/
bin2c.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/*
* This is bin2c program, which allows you to convert binary file to
* C language array, for use as embedded resource, for instance you can
* embed graphics or audio file directly into your program.
* This is public domain software, use it on your own risk.
* Contact Serge Fukanchik at [email protected] if you have any questions.
*
* Some modifications were made by Gwilym Kuiper ([email protected])
* I have decided not to change the licence.
*/
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef USE_BZ2
#include <bzlib.h>
#endif
int
main (int argc, char *argv[]) {
char *buf;
char *ident;
unsigned int i, file_size, need_comma;
FILE *f_input, *f_output;
#ifdef USE_BZ2
int status;
char *bz2_buf;
unsigned int uncompressed_size, bz2_size;
#endif
if (argc < 4) {
fprintf (stderr, "Usage: %s binary_file output_file array_name\n", argv[0]);
return -1;
}
f_input = fopen (argv[1], "rb");
if (f_input == NULL) {
fprintf (stderr, "%s: can't open %s for reading\n", argv[0], argv[1]);
return -1;
}
// Get the file length
fseek (f_input, 0, SEEK_END);
file_size = ftell (f_input);
fseek (f_input, 0, SEEK_SET);
if ((buf = malloc (file_size)) == NULL) {
fprintf (stderr, "Unable to malloc bin2c.c buffer\n");
fclose (f_input);
return -1;
}
if (fread (buf, file_size, 1, f_input) == 0) {
fprintf (stderr, "%s: can't read from %s\n", argv[0], argv[1]);
free (buf);
fclose (f_input);
return -1;
}
if (fgetc (f_input) != EOF) {
fprintf (stderr, "%s: can't read complete file %s\n", argv[0], argv[1]);
free (buf);
fclose (f_input);
return -1;
}
if (ferror (f_input)) {
fprintf (stderr, "%s: error while reading from %s\n", argv[0], argv[1]);
free (buf);
fclose (f_input);
return -1;
}
fclose (f_input);
#ifdef USE_BZ2
// allocate for bz2.
bz2_size = (file_size + file_size / 100 + 1) + 600; // as per the documentation
if ((bz2_buf = malloc (bz2_size)) == NULL) {
fprintf (stderr, "Unable to malloc bin2c.c buffer\n");
free (buf);
return -1;
}
// compress the data
status = BZ2_bzBuffToBuffCompress (bz2_buf, &bz2_size, buf, file_size, 9, 1, 0);
if (status != BZ_OK) {
fprintf (stderr, "Failed to compress data: error %i\n", status);
free (buf);
free (bz2_buf);
return -1;
}
// and be very lazy
free (buf);
uncompressed_size = file_size;
file_size = bz2_size;
buf = bz2_buf;
#endif
f_output = fopen (argv[2], "w");
if (f_output == NULL) {
fprintf (stderr, "%s: can't open %s for writing\n", argv[0], argv[1]);
free (buf);
return -1;
}
ident = argv[3];
need_comma = 0;
fprintf (f_output, "const char %s[%u] = {", ident, file_size);
for (i = 0; i < file_size; ++i) {
if (buf[i] == '\0') {
fprintf (stderr,
"%s: writing a null character terminates the content prematurely\n", argv[0]);
fclose (f_output);
free (buf);
return -1;
}
if (need_comma)
fprintf (f_output, ", ");
else
need_comma = 1;
if ((i % 11) == 0)
fprintf (f_output, "\n\t");
fprintf (f_output, "0x%.2x", buf[i] & 0xff);
}
fprintf (f_output, "\n};\n\n");
fprintf (f_output, "const int %s_length = %u;\n", ident, file_size);
#ifdef USE_BZ2
fprintf (f_output, "const int %s_length_uncompressed = %u;\n", ident, uncompressed_size);
#endif
if (ferror (f_output)) {
fprintf (stderr, "%s: error while writing to %s\n", argv[0], argv[2]);
fclose (f_output);
free (buf);
return -1;
}
fclose (f_output);
free (buf);
return 0;
}