//--------------------------------------------------------------------------------- int main(int argc, char **argv) { //--------------------------------------------------------------------------------- FILE *fin; size_t filelen; int linelen; int arg; int alignment = 4; if(argc < 2) { fputs( "bin2s - convert binary files to assembly language\n" "typical usage: bin2s foo.bin bar.bin baz.bin > foo.s\n", stderr); return 1; } for(arg = 1; arg < argc; arg++) { if (argv[arg][0] == '-') { switch (argv[arg][1]) { case 'a': alignment = (argc > arg) ? strtoul(argv[++arg], 0, 0) : 0; if ( alignment == 0 ) alignment =4; break; } continue; } fin = fopen(argv[arg], "rb"); if(!fin) { fputs("bin2s: could not open ", stderr); perror(argv[arg]); return 1; } fseek(fin, 0, SEEK_END); filelen = ftell(fin); rewind(fin); if(filelen == 0) { fclose(fin); fprintf(stderr, "bin2s: warning: skipping empty file %s\n", argv[arg]); continue; } char *ptr = argv[arg]; char chr; char *filename = NULL; while ( (chr=*ptr) ) { if ( chr == '\\' || chr == '/') { filename = ptr; } ptr++; } if ( NULL != filename ) { filename++; } else { filename = argv[arg]; } /*--------------------------------------------------------------------------------- Generate the prolog for each included file. It has two purposes: 1. provide length info, and 2. align to user defined boundary, default is 32bit ---------------------------------------------------------------------------------*/ fprintf( stdout, "/* Generated by BIN2S - please don't edit directly */\n" "\t.section .rodata\n" "\t.balign %d\n" "\t.global ", alignment); strnident(stdout, filename); fputs("_size\n", stdout); strnident(stdout, filename); printf("_size: .int %lu\n\t.global ", (unsigned long)filelen); strnident(stdout, filename); fputs("\n", stdout); strnident(stdout, filename); fputs(":\n\t.byte ", stdout); linelen = 0; while(filelen > 0) { unsigned char c = fgetc(fin); printf("%3u", (unsigned int)c); filelen--; /* don't put a comma after the last item */ if(filelen) { /* break after every 16th number */ if(++linelen >= 16) { linelen = 0; fputs("\n\t.byte ", stdout); } else { fputc(',', stdout); } } } fputs("\n\n\t.global ", stdout); strnident(stdout, filename); fputs("_end\n", stdout); strnident(stdout, filename); fputs("_end:\n\n", stdout); fclose(fin); } return 0; }
//--------------------------------------------------------------------------------- int main(int argc, char **argv) { //--------------------------------------------------------------------------------- FILE *fin; size_t filelen; int linelen; int arg; int alignment = 4; static int apple_llvm = 0; if(argc < 2) { showhelp(argv[0]); return -1; } int c; while (1) { static struct option long_options[] = { {"apple-llvm", no_argument, &apple_llvm, 1}, {"alignment", no_argument, 0, 'a'}, {"help", no_argument, 0, 'h'}, {0, 0, 0, 0} }; int option_index = 0; c = getopt_long (argc, argv, "a:h", long_options, &option_index); if (c == -1) break; switch(c) { case 'h': showhelp(argv[0]); case 'a': alignment = strtoul(optarg,0,0); break; case '?': if (optopt == 'a') fprintf (stderr, "Option -%c requires an argument.\n", optopt); else if (isprint (optopt)) fprintf (stderr, "Unknown option `-%c'.\n", optopt); else fprintf (stderr, "Unknown option character `\\x%x'.\n",optopt); return 1; } } for(arg = optind; arg < argc; arg++) { fin = fopen(argv[arg], "rb"); if(!fin) { fputs("bin2s: could not open ", stderr); perror(argv[arg]); return 1; } fseek(fin, 0, SEEK_END); filelen = ftell(fin); rewind(fin); if(filelen == 0) { fclose(fin); fprintf(stderr, "bin2s: warning: skipping empty file %s\n", argv[arg]); continue; } char *ptr = argv[arg]; char chr; char *filename = NULL; while ( (chr=*ptr) ) { if ( chr == '\\' || chr == '/') { filename = ptr; } ptr++; } if ( NULL != filename ) { filename++; } else { filename = argv[arg]; } /*--------------------------------------------------------------------------------- Generate the prolog for each included file. It has two purposes: 1. provide length info, and 2. align to user defined boundary, default is 32bit ---------------------------------------------------------------------------------*/ fprintf( stdout, "/* Generated by BIN2S - please don't edit directly */\n"); if (apple_llvm) { fprintf( stdout, "\t.const_data\n"); } else { fprintf( stdout,"\t.section .rodata\n"); } fprintf( stdout, "\t.balign %d\n" "\t.global ", alignment); strnident(stdout, filename, apple_llvm); fputs("_size\n", stdout); fputs("\t.global ", stdout); strnident(stdout, filename, apple_llvm); fputs("\n", stdout); strnident(stdout, filename, apple_llvm); fputs(":\n\t.byte ", stdout); linelen = 0; int count = filelen; while(count > 0) { unsigned char c = fgetc(fin); printf("%3u", (unsigned int)c); count--; /* don't put a comma after the last item */ if(count) { /* break after every 16th number */ if(++linelen >= 16) { linelen = 0; fputs("\n\t.byte ", stdout); } else { fputc(',', stdout); } } } fputs("\n\n\t.global ", stdout); strnident(stdout, filename, apple_llvm); fputs("_end\n", stdout); strnident(stdout, filename, apple_llvm); fputs("_end:\n\n", stdout); fputs("\t.balign 4\n",stdout); strnident(stdout, filename, apple_llvm); fprintf( stdout, "_size: .int %lu\n", (unsigned long)filelen); fclose(fin); } return 0; }