| /* |
| * Convert a data file into a .S file suitable for assembly. |
| * This reads from stdin and writes to stdout and takes a single |
| * argument for the name of the symbol in the assembly file. |
| */ |
| |
| #include <stdio.h> |
| |
| int main(int argc, char *argv[]) { |
| unsigned char buf[4096]; |
| size_t amt; |
| size_t i; |
| int col = 0; |
| char *name; |
| |
| if (argc != 2) { |
| fprintf(stderr, "usage: %s NAME < DAT_FILE > ASM_FILE\n", argv[0]); |
| for (i=0; i<argc; i++) { |
| fprintf(stderr, " '%s'", argv[i]); |
| } |
| fprintf(stderr, "\n"); |
| return 1; |
| } |
| |
| name = argv[1]; |
| |
| printf("\ |
| #ifdef __APPLE_CC__\n\ |
| /*\n\ |
| * The mid-2007 version of gcc that ships with Macs requires a\n\ |
| * comma on the .section line, but the rest of the world thinks\n\ |
| * that's a syntax error. It also wants globals to be explicitly\n\ |
| * prefixed with \"_\" as opposed to modern gccs that do the\n\ |
| * prefixing for you.\n\ |
| */\n\ |
| .globl _%s\n\ |
| .section .rodata,\n\ |
| .align 8\n\ |
| _%s:\n\ |
| #else\n\ |
| .globl %s\n\ |
| .section .rodata\n\ |
| .align 8\n\ |
| %s:\n\ |
| #endif\n\ |
| ", name, name, name, name); |
| |
| while (! feof(stdin)) { |
| amt = fread(buf, 1, sizeof(buf), stdin); |
| for (i = 0; i < amt; i++) { |
| if (col == 0) { |
| printf(".byte "); |
| } |
| printf("0x%02x", buf[i]); |
| col++; |
| if (col == 16) { |
| printf("\n"); |
| col = 0; |
| } else if (col % 4 == 0) { |
| printf(", "); |
| } else { |
| printf(","); |
| } |
| } |
| } |
| |
| if (col != 0) { |
| printf("\n"); |
| } |
| |
| return 0; |
| } |