Skip to content

Commit 7f2d5bb

Browse files
committed
bin2c: Major Optimizations including mmap and a LUT
On large files the gain can be around 8x
1 parent 7b20527 commit 7f2d5bb

File tree

1 file changed

+97
-55
lines changed

1 file changed

+97
-55
lines changed

tools/bin2c/src/bin2c.c

Lines changed: 97 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# ____| | ____| | | |____|
44
# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
55
#-----------------------------------------------------------------------
6-
# Copyright 2001-2004, ps2dev - http://www.ps2dev.org
6+
# Copyright 2001-2024, ps2dev - http://www.ps2dev.org
77
# Licenced under Academic Free License version 2.0
88
# Review ps2sdk README & LICENSE files for further details.
99
*/
@@ -12,64 +12,106 @@
1212
#include <sys/stat.h>
1313
#include <unistd.h>
1414
#include <fcntl.h>
15+
#include <sys/mman.h>
1516
#include <stdlib.h>
1617
#include <stdio.h>
18+
#include <string.h>
1719

18-
unsigned char *buffer;
20+
const char* const hex_lut[256] =
21+
{
22+
"0x00, ", "0x01, ", "0x02, ", "0x03, ", "0x04, ", "0x05, ", "0x06, ", "0x07, ", "0x08, ", "0x09, ", "0x0a, ", "0x0b, ", "0x0c, ", "0x0d, ", "0x0e, ", "0x0f, ",
23+
"0x10, ", "0x11, ", "0x12, ", "0x13, ", "0x14, ", "0x15, ", "0x16, ", "0x17, ", "0x18, ", "0x19, ", "0x1a, ", "0x1b, ", "0x1c, ", "0x1d, ", "0x1e, ", "0x1f, ",
24+
"0x20, ", "0x21, ", "0x22, ", "0x23, ", "0x24, ", "0x25, ", "0x26, ", "0x27, ", "0x28, ", "0x29, ", "0x2a, ", "0x2b, ", "0x2c, ", "0x2d, ", "0x2e, ", "0x2f, ",
25+
"0x30, ", "0x31, ", "0x32, ", "0x33, ", "0x34, ", "0x35, ", "0x36, ", "0x37, ", "0x38, ", "0x39, ", "0x3a, ", "0x3b, ", "0x3c, ", "0x3d, ", "0x3e, ", "0x3f, ",
26+
"0x40, ", "0x41, ", "0x42, ", "0x43, ", "0x44, ", "0x45, ", "0x46, ", "0x47, ", "0x48, ", "0x49, ", "0x4a, ", "0x4b, ", "0x4c, ", "0x4d, ", "0x4e, ", "0x4f, ",
27+
"0x50, ", "0x51, ", "0x52, ", "0x53, ", "0x54, ", "0x55, ", "0x56, ", "0x57, ", "0x58, ", "0x59, ", "0x5a, ", "0x5b, ", "0x5c, ", "0x5d, ", "0x5e, ", "0x5f, ",
28+
"0x60, ", "0x61, ", "0x62, ", "0x63, ", "0x64, ", "0x65, ", "0x66, ", "0x67, ", "0x68, ", "0x69, ", "0x6a, ", "0x6b, ", "0x6c, ", "0x6d, ", "0x6e, ", "0x6f, ",
29+
"0x70, ", "0x71, ", "0x72, ", "0x73, ", "0x74, ", "0x75, ", "0x76, ", "0x77, ", "0x78, ", "0x79, ", "0x7a, ", "0x7b, ", "0x7c, ", "0x7d, ", "0x7e, ", "0x7f, ",
30+
"0x80, ", "0x81, ", "0x82, ", "0x83, ", "0x84, ", "0x85, ", "0x86, ", "0x87, ", "0x88, ", "0x89, ", "0x8a, ", "0x8b, ", "0x8c, ", "0x8d, ", "0x8e, ", "0x8f, ",
31+
"0x90, ", "0x91, ", "0x92, ", "0x93, ", "0x94, ", "0x95, ", "0x96, ", "0x97, ", "0x98, ", "0x99, ", "0x9a, ", "0x9b, ", "0x9c, ", "0x9d, ", "0x9e, ", "0x9f, ",
32+
"0xa0, ", "0xa1, ", "0xa2, ", "0xa3, ", "0xa4, ", "0xa5, ", "0xa6, ", "0xa7, ", "0xa8, ", "0xa9, ", "0xaa, ", "0xab, ", "0xac, ", "0xad, ", "0xae, ", "0xaf, ",
33+
"0xb0, ", "0xb1, ", "0xb2, ", "0xb3, ", "0xb4, ", "0xb5, ", "0xb6, ", "0xb7, ", "0xb8, ", "0xb9, ", "0xba, ", "0xbb, ", "0xbc, ", "0xbd, ", "0xbe, ", "0xbf, ",
34+
"0xc0, ", "0xc1, ", "0xc2, ", "0xc3, ", "0xc4, ", "0xc5, ", "0xc6, ", "0xc7, ", "0xc8, ", "0xc9, ", "0xca, ", "0xcb, ", "0xcc, ", "0xcd, ", "0xce, ", "0xcf, ",
35+
"0xd0, ", "0xd1, ", "0xd2, ", "0xd3, ", "0xd4, ", "0xd5, ", "0xd6, ", "0xd7, ", "0xd8, ", "0xd9, ", "0xda, ", "0xdb, ", "0xdc, ", "0xdd, ", "0xde, ", "0xdf, ",
36+
"0xe0, ", "0xe1, ", "0xe2, ", "0xe3, ", "0xe4, ", "0xe5, ", "0xe6, ", "0xe7, ", "0xe8, ", "0xe9, ", "0xea, ", "0xeb, ", "0xec, ", "0xed, ", "0xee, ", "0xef, ",
37+
"0xf0, ", "0xf1, ", "0xf2, ", "0xf3, ", "0xf4, ", "0xf5, ", "0xf6, ", "0xf7, ", "0xf8, ", "0xf9, ", "0xfa, ", "0xfb, ", "0xfc, ", "0xfd, ", "0xfe, ", "0xff, "
38+
};
1939

2040
int main(int argc, char *argv[])
2141
{
22-
int fd_size;
23-
FILE *source,*dest;
24-
int i;
25-
26-
if(argc != 4) {
27-
printf("bin2c - from bin2s By Sjeep\n"
28-
"Usage: bin2c infile outfile label\n\n");
29-
return 1;
30-
}
31-
32-
if((source=fopen( argv[1], "rb")) == NULL) {
33-
printf("Error opening %s for reading.\n",argv[1]);
34-
return 1;
35-
}
36-
37-
fseek(source,0,SEEK_END);
38-
fd_size = ftell(source);
39-
fseek(source,0,SEEK_SET);
40-
41-
buffer = malloc(fd_size);
42-
if(buffer == NULL) {
43-
printf("Failed to allocate memory.\n");
44-
fclose(source);
45-
return 1;
46-
}
47-
48-
if(fread(buffer,1,fd_size,source) != fd_size) {
49-
printf("Failed to read file.\n");
50-
fclose(source);
51-
return 1;
52-
}
53-
fclose(source);
54-
55-
if((dest = fopen(argv[2],"w+")) == NULL) {
56-
printf("Failed to open/create %s.\n",argv[2]);
57-
return 1;
58-
}
59-
60-
fprintf(dest, "#ifndef __%s__\n", argv[3]);
61-
fprintf(dest, "#define __%s__\n\n", argv[3]);
62-
fprintf(dest, "unsigned int size_%s = %d;\n", argv[3], fd_size);
63-
fprintf(dest, "unsigned char %s[] __attribute__((aligned(16))) = {", argv[3]);
64-
65-
for(i=0;i<fd_size;i+=1) {
66-
if((i % 16) == 0) fprintf(dest, "\n\t");
67-
fprintf(dest, "0x%02x, ", buffer[i]);
68-
}
69-
70-
fprintf(dest, "\n};\n\n#endif\n");
71-
72-
fclose(dest);
73-
74-
return 0;
42+
int src_fd;
43+
int dst_fd;
44+
45+
if (argc != 4) {
46+
printf("bin2c - from bin2s By Sjeep\n"
47+
"Modified by Fobes/ps2dev\n\n"
48+
"Usage: bin2c infile outfile label\n\n");
49+
return 1;
50+
}
51+
52+
if ((src_fd = open(argv[1], O_RDONLY, (mode_t)0600)) == -1) {
53+
printf("Error opening %s for reading.\n", argv[1]);
54+
return 1;
55+
}
56+
57+
struct stat src_stat;
58+
fstat(src_fd, &src_stat);
59+
u_int8_t *src_map = mmap(0, src_stat.st_size, PROT_READ, MAP_PRIVATE, src_fd, 0);
60+
61+
if (src_map == MAP_FAILED) {
62+
printf("Failed to map input file.\n");
63+
return 1;
64+
}
65+
66+
if ((dst_fd = open(argv[2], O_RDWR | O_CREAT | O_TRUNC)) == -1) {
67+
printf("Failed to open/create %s.\n", argv[2]);
68+
return 1;
69+
}
70+
71+
char prologue[1024];
72+
snprintf(prologue, 1024, "#ifndef __%s__\n"
73+
"#define __%s__\n\n"
74+
"unsigned int size_%s = %d;\n"
75+
"unsigned char %s[] __attribute__((aligned(16))) = {",
76+
argv[3], argv[3], argv[3], (int)src_stat.st_size, argv[3]);
77+
78+
const char *epilogue = "\n};\n\n#endif\n";
79+
80+
const size_t size_prologue = strlen(prologue);
81+
const size_t size_epilogue = strlen(epilogue);
82+
size_t dst_total_size = size_prologue + size_epilogue + (src_stat.st_size * 6) + (src_stat.st_size / 16 * 2) + ((src_stat.st_size % 16) ? 2 : 0);
83+
84+
lseek(dst_fd, dst_total_size - 1, SEEK_SET);
85+
write(dst_fd, "", 1);
86+
lseek(dst_fd, 0, SEEK_SET);
87+
88+
char *dst_map = mmap(0, dst_total_size, PROT_WRITE, MAP_SHARED, dst_fd, 0);
89+
char *dst_map_start = dst_map;
90+
if (dst_map == MAP_FAILED) {
91+
printf("Failed to map output file.\n");
92+
close(dst_fd);
93+
return 1;
94+
}
95+
96+
memcpy(dst_map, prologue, size_prologue);
97+
dst_map += strlen(prologue);
98+
99+
for (int i = 0; i < src_stat.st_size; i++) {
100+
if ((i % 16) == 0) {
101+
*dst_map++ = '\n';
102+
*dst_map++ = '\t';
103+
}
104+
memcpy(dst_map, hex_lut[src_map[i]], 6);
105+
dst_map += 6;
106+
}
107+
108+
memcpy(dst_map, epilogue, size_epilogue);
109+
110+
msync(dst_map_start, dst_total_size, MS_SYNC);
111+
munmap(dst_map_start, dst_total_size);
112+
close(dst_fd);
113+
114+
munmap(src_map, src_stat.st_size);
115+
close(src_fd);
116+
return 0;
75117
}

0 commit comments

Comments
 (0)