コード例 #1
0
//---------------------------------------------------------------------------------
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;
}
コード例 #2
0
ファイル: bin2s.c プロジェクト: devkitPro/general-tools
//---------------------------------------------------------------------------------
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;
}