Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 1 Jul 2009 22:48:23 -0300
From:      "Carlos A. M. dos Santos" <unixmania@gmail.com>
To:        Alexander Best <alexbestms@math.uni-muenster.de>
Cc:        rick-freebsd2008@kiwi-computer.com, freebsd-hackers@freebsd.org
Subject:   Re: c question: *printf'ing arrays
Message-ID:  <e71790db0907011848q15e86301ycb171871156da1ae@mail.gmail.com>
In-Reply-To: <permail-2009063022060580e26a0b00003f4a-a_best01@message-id.uni-muenster.de>
References:  <20090630210238.GA33849@keira.kiwi-computer.com> <permail-2009063022060580e26a0b00003f4a-a_best01@message-id.uni-muenster.de>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Jun 30, 2009 at 7:06 PM, Alexander
Best<alexbestms@math.uni-muenster.de> wrote:
> thanks for all the help. i decided to take the pill and coded all the fpr=
intfs
> by hand. here's the result. usually i'd stick to a higher level languag, =
but i
> need C's inline assembly support:
>
> =A0 =A0struct Header
> =A0 =A0{
> =A0 =A0 =A0 =A0u_int8_t rom_entry[4];
> =A0 =A0 =A0 =A0u_int8_t nintendo_logo[156];
> =A0 =A0 =A0 =A0u_char game_title[12];
> =A0 =A0 =A0 =A0u_char game_code[4];
> =A0 =A0 =A0 =A0u_char maker_code[2];
> =A0 =A0 =A0 =A0u_int8_t fixed_val;
> =A0 =A0 =A0 =A0u_int8_t unit_code;
> =A0 =A0 =A0 =A0u_int8_t device_type;
> =A0 =A0 =A0 =A0u_int8_t reserved_area1[7];
> =A0 =A0 =A0 =A0u_int8_t software_version;
> =A0 =A0 =A0 =A0u_int8_t complement_check;
> =A0 =A0 =A0 =A0u_int8_t reserved_area2;
> =A0 =A0 =A0 =A0u_int8_t ram_entry[4];
> =A0 =A0 =A0 =A0u_int8_t boot_mode;
> =A0 =A0 =A0 =A0u_int8_t slave_id;
> =A0 =A0 =A0 =A0u_int8_t unused_area[26];
> =A0 =A0 =A0 =A0u_int8_t joybus_entry[4];
> =A0 =A0};
>
> =A0 =A0struct Header * hdr =3D rom;
> =A0 =A0int i;
>
> =A0 =A0fprintf(stderr, "ROM Entry: 0x");
> =A0 =A0for (i=3D0; i < 4; i++) fprintf(stderr, "%x", hdr->rom_entry[i]);
> =A0 =A0fprintf(stderr, "\nNintendo Logo: 0x");
> =A0 =A0for (i=3D0; i < sizeof(hdr->nintendo_logo); i++) fprintf(stderr, "=
%x",
> =A0 =A0hdr->nintendo_logo[i]);
> =A0 =A0fprintf(stderr, "\nGame Title: %s", =A0hdr->game_title);
> =A0 =A0fprintf(stderr, "\nGame Code: %s", =A0hdr->game_code);
> =A0 =A0fprintf(stderr, "\nMaker Code: %s", =A0hdr->maker_code);
> =A0 =A0fprintf(stderr, "\nFixed Value: 0x");
> =A0 =A0fprintf(stderr, "%x", hdr->fixed_val);
> =A0 =A0fprintf(stderr, "\nUnit Code: 0x");
> =A0 =A0fprintf(stderr, "%x", hdr->unit_code);
> =A0 =A0fprintf(stderr, "\nDevice Type: 0x");
> =A0 =A0fprintf(stderr, "%x", hdr->device_type);
> =A0 =A0fprintf(stderr, "\nReserved Area: 0x");
> =A0 =A0for (i=3D0; i < sizeof(hdr->reserved_area1); i++) fprintf(stderr, =
"%x",
> =A0 =A0hdr->reserved_area1[i]);
> =A0 =A0fprintf(stderr, "\nSoftware Version: 0x");
> =A0 =A0fprintf(stderr, "%x", hdr->software_version);
> =A0 =A0fprintf(stderr, "\nComplement Check: 0x");
> =A0 =A0fprintf(stderr, "%x", hdr->complement_check);
> =A0 =A0fprintf(stderr, "\nReserved Area: 0x");
> =A0 =A0fprintf(stderr, "%x", hdr->reserved_area2);
> =A0 =A0fprintf(stderr, "\nRAM Entry Point: 0x");
> =A0 =A0for (i=3D0; i < sizeof(hdr->ram_entry); i++) fprintf(stderr, "%x",
> =A0 =A0hdr->ram_entry[i]);
> =A0 =A0fprintf(stderr, "\nBoot Mode: 0x");
> =A0 =A0fprintf(stderr, "%x", hdr->boot_mode);
> =A0 =A0fprintf(stderr, "\nSlave ID: 0x");
> =A0 =A0fprintf(stderr, "%x", hdr->slave_id);
> =A0 =A0fprintf(stderr, "\nUnused Area: 0x");
> =A0 =A0for (i=3D0; i < sizeof(hdr->unused_area); i++) fprintf(stderr, "%x=
",
> =A0 =A0hdr->unused_area[i]);
> =A0 =A0fprintf(stderr, "\nJoybus Entry Point: 0x");
> =A0 =A0for (i=3D0; i < sizeof(hdr->joybus_entry); i++) fprintf(stderr, "%=
x",
> =A0 =A0hdr->joybus_entry[i]);

The code below is a bit more efficient and easier to read. It is also
safer, since it limits the width of the %s conversions to the sizes of
the corresponding arrays.

	fprintf(stderr, "ROM Entry: 0x");
	for (i=3D0; i < 4; i++)
		fprintf(stderr, "%x", hdr->rom_entry[i]);
	fprintf(stderr, "\nNintendo Logo: 0x");
	for (i=3D0; i < sizeof(hdr->nintendo_logo); i++)
		fprintf(stderr, "%x", hdr->nintendo_logo[i]);
	fprintf(stderr,
		"\nGame Title: %.*s"
		"\nGame Code: %.*s"
		"\nMaker Code: %.*s"
		"\nFixed Value: 0x%x"
		"\nUnit Code: 0x%x"
		"\nDevice Type: 0x%x"
		"\nReserved Area: 0x",
      		sizeof(hdr->game_title), hdr->game_title,
		sizeof(hdr->game_code), hdr->game_code,
		sizeof(hdr->maker_code), hdr->maker_code,
		hdr->fixed_val,
		hdr->unit_code,
		hdr->device_type);
	for (i=3D0; i < sizeof(hdr->reserved_area1); i++)
		fprintf(stderr, "%x", hdr->reserved_area1[i]);
	fprintf(stderr,
		"\nSoftware Version: 0x%x"
		"\nComplement Check: 0x%x"
		"\nReserved Area: 0x%x"
		"\nRAM Entry Point: 0x",
		hdr->software_version,
		hdr->complement_check,
		hdr->reserved_area2);
	for (i=3D0; i < sizeof(hdr->ram_entry); i++)
		fprintf(stderr, "%x", hdr->ram_entry[i]);
	fprintf(stderr,
		"\nBoot Mode: 0x""%x"
		"\nSlave ID: 0x""%x"
		"\nUnused Area: 0x",
		hdr->boot_mode,
		hdr->slave_id);
	for (i=3D0; i < sizeof(hdr->unused_area); i++)
		fprintf(stderr, "%x", hdr->unused_area[i]);
	fprintf(stderr, "\nJoybus Entry Point: 0x");
	for (i=3D0; i < sizeof(hdr->joybus_entry); i++)
		fprintf(stderr, "%x", hdr->joybus_entry[i]);
	fprintf(stderr, "\n");



--=20
My preferred quotation of Robert Louis Stevenson is "You cannot
make an omelette without breaking eggs". Not because I like the
omelettes, but because I like the sound of eggs being broken.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?e71790db0907011848q15e86301ycb171871156da1ae>