|
3 | 3 | # ____| | ____| | | |____| |
4 | 4 | # | ___| |____ ___| ____| | \ PS2DEV Open Source Project. |
5 | 5 | #----------------------------------------------------------------------- |
6 | | -# Copyright 2001-2004, ps2dev - http://www.ps2dev.org |
| 6 | +# Copyright 2001-2024, ps2dev - http://www.ps2dev.org |
7 | 7 | # Licenced under Academic Free License version 2.0 |
8 | 8 | # Review ps2sdk README & LICENSE files for further details. |
9 | 9 | */ |
|
12 | 12 | #include <sys/stat.h> |
13 | 13 | #include <unistd.h> |
14 | 14 | #include <fcntl.h> |
| 15 | +#include <sys/mman.h> |
15 | 16 | #include <stdlib.h> |
16 | 17 | #include <stdio.h> |
| 18 | +#include <string.h> |
17 | 19 |
|
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 | +}; |
19 | 39 |
|
20 | 40 | int main(int argc, char *argv[]) |
21 | 41 | { |
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; |
75 | 117 | } |
0 commit comments