/* * 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 int main(int argc, char *argv[]) { unsigned char buf[4096]; size_t amt; size_t i; int col = 0; char *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++) { printf((col == 0) ? ".byte %3d" : ",%3d", buf[i]); col++; if (col == 16) { printf("\n"); col = 0; } } } if (col != 0) { printf("\n"); } }