dumpres.c 22.6 KB
Newer Older
Alexandre Julliard's avatar
Alexandre Julliard committed
1
/*
2
 * Copyright 1998 Bertho A. Stultiens (BS)
Alexandre Julliard's avatar
Alexandre Julliard committed
3
 *
4 5 6 7
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
Alexandre Julliard's avatar
Alexandre Julliard committed
8
 *
9 10 11 12 13 14 15
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
16
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
Alexandre Julliard's avatar
Alexandre Julliard committed
17 18
 */

19 20
#include "config.h"

21
#include <assert.h>
Alexandre Julliard's avatar
Alexandre Julliard committed
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
#include <stdio.h>
#include <ctype.h>

#include "wrc.h"
#include "dumpres.h"

/*
 *****************************************************************************
 * Function	: get_typename
 * Syntax	: char *get_typename(resource_t* r)
 * Input	:
 *	r	- Resource description
 * Output	: A pointer to a string representing the resource type
 * Description	:
 * Remarks	:
 *****************************************************************************
*/
39
const char *get_typename(const resource_t* r)
Alexandre Julliard's avatar
Alexandre Julliard committed
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
{
	switch(r->type){
	case res_acc:	return "ACCELERATOR";
	case res_bmp:	return "BITMAP";
	case res_cur:	return "CURSOR";
	case res_curg:	return "GROUP_CURSOR";
	case res_dlg:	return "DIALOG";
	case res_fnt:	return "FONT";
	case res_ico:	return "ICON";
	case res_icog:	return "GROUP_ICON";
	case res_men:	return "MENU";
	case res_rdt:	return "RCDATA";
	case res_stt:	return "STRINGTABLE";
	case res_usr:   return "UserResource";
	case res_msg:	return "MESSAGETABLE";
	case res_ver:	return "VERSIONINFO";
56
	case res_dlginit: return "DLGINIT";
57
	case res_toolbar: return "TOOLBAR";
58 59
	case res_anicur:  return "CURSOR (animated)";
	case res_aniico:  return "ICON (animated)";
Alexandre Julliard's avatar
Alexandre Julliard committed
60 61 62 63 64 65 66 67 68 69 70 71 72 73
	default: 	return "Unknown";
	}
}

/*
 *****************************************************************************
 * Function	: strncpyWtoA
 * Syntax	: char *strncpyWtoA(char *cs, short *ws, int maxlen)
 * Input	:
 *	cs	- Pointer to buffer to receive result
 *	ws	- Source wide-string
 *	maxlen	- Max chars to copy
 * Output	: 'cs'
 * Description	: Copy a unicode string to ascii. Copying stops after the
Andreas Mohr's avatar
Andreas Mohr committed
74
 *		  first occurring '\0' or when maxlen-1 chars are copied. The
Alexandre Julliard's avatar
Alexandre Julliard committed
75 76 77 78
 *		  String is always nul terminated.
 * Remarks	: No codepage translation is done.
 *****************************************************************************
*/
79
static char *strncpyWtoA(char *cs, const WCHAR *ws, int maxlen)
Alexandre Julliard's avatar
Alexandre Julliard committed
80 81
{
	char *cptr = cs;
82
	const WCHAR *wsMax = ws + maxlen - 1;
83
	while(*ws && ws < wsMax)
Alexandre Julliard's avatar
Alexandre Julliard committed
84
	{
85
		if(*ws > 255)
86
			fprintf(stderr, "***Warning: Unicode string contains non-printable chars***\n");
Alexandre Julliard's avatar
Alexandre Julliard committed
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
		*cptr++ = (char)*ws++;
	}
	*cptr = '\0';
	return cs;
}

/*
 *****************************************************************************
 * Function	: print_string
 * Syntax	: void print_string(string_t *str)
 * Input	:
 * Output	:
 * Description	:
 * Remarks	:
 *****************************************************************************
*/
103
static void print_string(const string_t *str)
Alexandre Julliard's avatar
Alexandre Julliard committed
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
{
	char buffer[512];
	if(!str)
		printf("<none>");
	else if(str->type == str_char)
		printf("\"%s\"", str->str.cstr);
	else
	{
		strncpyWtoA(buffer, str->str.wstr, sizeof(buffer));
		printf("L\"%s\"", buffer);
	}
}

/*
 *****************************************************************************
 * Function	: get_nameid_str
120
 * Syntax	: const char *get_nameid_str(const name_id_t *n)
Alexandre Julliard's avatar
Alexandre Julliard committed
121 122 123 124 125 126 127
 * Input	:
 *	n	- nameid to convert to text
 * Output	: A pointer to the name.
 * Description	:
 * Remarks	: Not reentrant because of static buffer
 *****************************************************************************
*/
128
const char *get_nameid_str(const name_id_t *n)
Alexandre Julliard's avatar
Alexandre Julliard committed
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
{
	static char buffer[256];

	if(!n)
		return "<none>";

	if(n->type == name_ord)
	{
		sprintf(buffer, "%d", n->name.i_name);
		return buffer;
	}
	else if(n->type == name_str)
	{
		if(n->name.s_name->type == str_char)
			return n->name.s_name->str.cstr;
		else
		{
			strncpyWtoA(buffer, n->name.s_name->str.wstr, sizeof(buffer));
			return buffer;
		}
	}
	else
		return "Hoooo, report this: wrong type in nameid";
}

/*
 *****************************************************************************
 * Function	: dump_memopt
 * Syntax	: void dump_memopt(DWORD memopt)
 * Input	:
 *	memopt	- flag bits of the options set
 * Output	:
 * Description	:
 * Remarks	:
 *****************************************************************************
*/
165
static void dump_memopt(DWORD memopt)
Alexandre Julliard's avatar
Alexandre Julliard committed
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
{
	printf("Memory/load options: ");
	if(memopt & 0x0040)
		printf("PRELOAD ");
	else
		printf("LOADONCALL ");
	if(memopt & 0x0010)
		printf("MOVEABLE ");
	else
		printf("FIXED ");
	if(memopt & 0x0020)
		printf("PURE ");
	else
		printf("IMPURE ");
	if(memopt & 0x1000)
		printf("DISCARDABLE");
	printf("\n");
}

/*
 *****************************************************************************
 * Function	: dump_lvc
188
 * Syntax	: void dump_lvc(const lvc_t *l)
Alexandre Julliard's avatar
Alexandre Julliard committed
189 190 191 192 193 194 195
 * Input	:
 *	l	- pointer to lvc structure
 * Output	:
 * Description	: Dump language, version and characteristics
 * Remarks	:
 *****************************************************************************
*/
196
static void dump_lvc(const lvc_t *l)
Alexandre Julliard's avatar
Alexandre Julliard committed
197 198 199 200 201 202 203
{
	if(l->language)
		printf("LANGUAGE %04x, %04x\n", l->language->id, l->language->sub);
	else
		printf("LANGUAGE <not set>\n");

	if(l->version)
204
		printf("VERSION %08x\n", *(l->version));
Alexandre Julliard's avatar
Alexandre Julliard committed
205 206 207 208
	else
		printf("VERSION <not set>\n");

	if(l->characts)
209
		printf("CHARACTERISTICS %08x\n", *(l->characts));
Alexandre Julliard's avatar
Alexandre Julliard committed
210 211 212 213 214 215 216
	else
		printf("CHARACTERISTICS <not set>\n");
}

/*
 *****************************************************************************
 * Function	: dump_raw_data
217
 * Syntax	: void dump_raw_data(const raw_data_t *d)
Alexandre Julliard's avatar
Alexandre Julliard committed
218 219 220 221 222 223 224
 * Input	:
 *	d	- Raw data descriptor
 * Output	:
 * Description	:
 * Remarks	:
 *****************************************************************************
*/
225
static void dump_raw_data(const raw_data_t *d)
Alexandre Julliard's avatar
Alexandre Julliard committed
226
{
227
	unsigned int n;
Alexandre Julliard's avatar
Alexandre Julliard committed
228 229 230 231 232 233 234 235 236 237 238 239 240 241
	int i;
	int j;

	if(!d)
	{
		printf("<none>");
		return;
	}
	printf("Rawdata size: %d\n", d->size);
	if(debuglevel < 2)
		return;

	for(n = 0; n < d->size; n++)
	{
242
		if((n % 16) == 0)
243
                {
Alexandre Julliard's avatar
Alexandre Julliard committed
244 245 246 247
			if(n)
			{
				printf("- ");
				for(i = 0; i < 16; i++)
248
					printf("%c", isprint(d->data[n-16+i] & 0xff) ? d->data[n-16+i] : '.');
Alexandre Julliard's avatar
Alexandre Julliard committed
249 250 251 252
				printf("\n%08x: ", n);
			}
			else
				printf("%08x: ", n);
253
                }
Alexandre Julliard's avatar
Alexandre Julliard committed
254 255 256 257 258 259 260
		printf("%02x ", d->data[n] & 0xff);
	}
	printf("- ");
	j = d->size % 16;
	if(!j)
		j = 16;
	for(i = 0; i < j; i++)
261
		printf("%c", isprint(d->data[n-j+i] & 0xff) ? d->data[n-j+i] : '.');
Alexandre Julliard's avatar
Alexandre Julliard committed
262 263 264 265 266 267
	printf("\n");
}

/*
 *****************************************************************************
 * Function	: dump_accelerator
268
 * Syntax	: void dump_accelerator(const accelerator_t *acc)
Alexandre Julliard's avatar
Alexandre Julliard committed
269 270 271 272 273 274 275
 * Input	:
 *	acc	- Accelerator resource descriptor
 * Output	: nop
 * Description	:
 * Remarks	:
 *****************************************************************************
*/
276
static void dump_accelerator(const accelerator_t *acc)
Alexandre Julliard's avatar
Alexandre Julliard committed
277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301
{
	event_t *ev = acc->events;

	dump_memopt(acc->memopt);
	dump_lvc(&(acc->lvc));

	printf("Events: %s\n", ev ? "" : "<none>");
	while(ev)
	{
		printf("Key=");
		if(isprint(ev->key))
			printf("\"%c\"", ev->key);
		else if(iscntrl(ev->key))
			printf("\"^%c\"", ev->key +'@');
		else
			printf("\\x%02x", ev->key & 0xff);

		printf(" Id=%d flags=%04x\n", ev->id, ev->flags);
		ev = ev->next;
	}
}

/*
 *****************************************************************************
 * Function	: dump_cursor
302
 * Syntax	: void dump_cursor(const cursor_t *cur)
Alexandre Julliard's avatar
Alexandre Julliard committed
303 304 305 306 307 308 309
 * Input	:
 *	cur	- Cursor resource descriptor
 * Output	: nop
 * Description	:
 * Remarks	:
 *****************************************************************************
*/
310
static void dump_cursor(const cursor_t *cur)
Alexandre Julliard's avatar
Alexandre Julliard committed
311 312 313 314 315 316 317 318 319 320 321 322
{
	printf("Id: %d\n", cur->id);
	printf("Width: %d\n", cur->width);
	printf("Height: %d\n", cur->height);
	printf("X Hotspot: %d\n", cur->xhot);
	printf("Y Hotspot: %d\n", cur->yhot);
	dump_raw_data(cur->data);
}

/*
 *****************************************************************************
 * Function	: dump_cursor_group
323
 * Syntax	: void dump_cursor_group(const cursor_group_t *cur)
Alexandre Julliard's avatar
Alexandre Julliard committed
324 325 326 327 328 329 330
 * Input	:
 *	cur	- Cursor group resource descriptor
 * Output	: nop
 * Description	:
 * Remarks	:
 *****************************************************************************
*/
331
static void dump_cursor_group(const cursor_group_t *curg)
Alexandre Julliard's avatar
Alexandre Julliard committed
332 333 334 335 336 337 338 339
{
	dump_memopt(curg->memopt);
	printf("There are %d cursors in this group\n", curg->ncursor);
}

/*
 *****************************************************************************
 * Function	: dump_icon
340
 * Syntax	: void dump_icon(const icon_t *ico)
Alexandre Julliard's avatar
Alexandre Julliard committed
341 342 343 344 345 346 347
 * Input	:
 *	ico	- Icon resource descriptor
 * Output	: nop
 * Description	:
 * Remarks	:
 *****************************************************************************
*/
348
static void dump_icon(const icon_t *ico)
Alexandre Julliard's avatar
Alexandre Julliard committed
349 350 351 352 353 354 355 356 357 358 359 360 361
{
	printf("Id: %d\n", ico->id);
	printf("Width: %d\n", ico->width);
	printf("Height: %d\n", ico->height);
	printf("NColor: %d\n", ico->nclr);
	printf("NPlanes: %d\n", ico->planes);
	printf("NBits: %d\n", ico->bits);
	dump_raw_data(ico->data);
}

/*
 *****************************************************************************
 * Function	: dump_icon_group
362
 * Syntax	: void dump_icon_group(const icon_group_t *ico)
Alexandre Julliard's avatar
Alexandre Julliard committed
363 364 365 366 367 368 369
 * Input	:
 *	ico	- Icon group resource descriptor
 * Output	: nop
 * Description	:
 * Remarks	:
 *****************************************************************************
*/
370
static void dump_icon_group(const icon_group_t *icog)
Alexandre Julliard's avatar
Alexandre Julliard committed
371 372 373 374 375
{
	dump_memopt(icog->memopt);
	printf("There are %d icons in this group\n", icog->nicon);
}

376 377 378
/*
 *****************************************************************************
 * Function	: dump_ani_curico
379
 * Syntax	: void dump_ani_curico(const ani_curico_t *ani)
380 381 382 383 384 385 386
 * Input	:
 *	ani	- Animated object resource descriptor
 * Output	: nop
 * Description	:
 * Remarks	:
 *****************************************************************************
*/
387
static void dump_ani_curico(const ani_curico_t *ani)
388 389 390 391 392 393
{
	dump_memopt(ani->memopt);
	dump_lvc(&ani->data->lvc);
	dump_raw_data(ani->data);
}

Alexandre Julliard's avatar
Alexandre Julliard committed
394 395 396
/*
 *****************************************************************************
 * Function	: dump_font
397
 * Syntax	: void dump_font(const font_t *fnt)
Alexandre Julliard's avatar
Alexandre Julliard committed
398 399 400 401 402 403 404
 * Input	:
 *	fnt	- Font resource descriptor
 * Output	: nop
 * Description	:
 * Remarks	:
 *****************************************************************************
*/
405
static void dump_font(const font_t *fnt)
Alexandre Julliard's avatar
Alexandre Julliard committed
406 407
{
	dump_memopt(fnt->memopt);
408
	dump_lvc(&(fnt->data->lvc));
Alexandre Julliard's avatar
Alexandre Julliard committed
409 410 411 412 413 414
	dump_raw_data(fnt->data);
}

/*
 *****************************************************************************
 * Function	: dump_bitmap
415
 * Syntax	: void dump_bitmap(const bitmap_t *bmp)
Alexandre Julliard's avatar
Alexandre Julliard committed
416 417 418 419 420 421 422
 * Input	:
 *	bmp	- Bitmap resource descriptor
 * Output	: nop
 * Description	:
 * Remarks	:
 *****************************************************************************
*/
423
static void dump_bitmap(const bitmap_t *bmp)
Alexandre Julliard's avatar
Alexandre Julliard committed
424 425
{
	dump_memopt(bmp->memopt);
426
	dump_lvc(&(bmp->data->lvc));
Alexandre Julliard's avatar
Alexandre Julliard committed
427 428 429 430 431 432
	dump_raw_data(bmp->data);
}

/*
 *****************************************************************************
 * Function	: dump_rcdata
433
 * Syntax	: void dump_rcdata(const rcdata_t *rdt)
Alexandre Julliard's avatar
Alexandre Julliard committed
434 435 436 437 438 439 440
 * Input	:
 *	rdt	- RCData resource descriptor
 * Output	: nop
 * Description	:
 * Remarks	:
 *****************************************************************************
*/
441
static void dump_rcdata(const rcdata_t *rdt)
Alexandre Julliard's avatar
Alexandre Julliard committed
442 443
{
	dump_memopt(rdt->memopt);
444
	dump_lvc(&(rdt->data->lvc));
Alexandre Julliard's avatar
Alexandre Julliard committed
445 446 447 448 449 450
	dump_raw_data(rdt->data);
}

/*
 *****************************************************************************
 * Function	: dump_user
451
 * Syntax	: void dump_user(const user_t *usr)
Alexandre Julliard's avatar
Alexandre Julliard committed
452 453 454 455 456 457 458
 * Input	:
 *	usr	- User resource descriptor
 * Output	: nop
 * Description	:
 * Remarks	:
 *****************************************************************************
*/
459
static void dump_user(const user_t *usr)
Alexandre Julliard's avatar
Alexandre Julliard committed
460 461
{
	dump_memopt(usr->memopt);
462
	dump_lvc(&(usr->data->lvc));
Alexandre Julliard's avatar
Alexandre Julliard committed
463 464 465 466 467 468 469
	printf("Class %s\n", get_nameid_str(usr->type));
	dump_raw_data(usr->data);
}

/*
 *****************************************************************************
 * Function	: dump_messagetable
470
 * Syntax	: void dump_messagetable(const messagetable_t *msg)
Alexandre Julliard's avatar
Alexandre Julliard committed
471 472 473 474 475 476 477
 * Input	:
 *	msg	- Messagetable resource descriptor
 * Output	: nop
 * Description	:
 * Remarks	:
 *****************************************************************************
*/
478
static void dump_messagetable(const messagetable_t *msg)
Alexandre Julliard's avatar
Alexandre Julliard committed
479
{
480
	dump_memopt(msg->memopt);
481
	dump_lvc(&(msg->data->lvc));
Alexandre Julliard's avatar
Alexandre Julliard committed
482 483 484 485 486 487
	dump_raw_data(msg->data);
}

/*
 *****************************************************************************
 * Function	: dump_stringtable
488
 * Syntax	: void dump_stringtable(const stringtable_t *stt)
Alexandre Julliard's avatar
Alexandre Julliard committed
489 490 491 492 493 494 495
 * Input	:
 *	stt	- Stringtable resource descriptor
 * Output	: nop
 * Description	:
 * Remarks	:
 *****************************************************************************
*/
496
static void dump_stringtable(const stringtable_t *stt)
Alexandre Julliard's avatar
Alexandre Julliard committed
497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519
{
	int i;
	for(; stt; stt = stt->next)
	{
		printf("{\n");
		dump_memopt(stt->memopt);
		dump_lvc(&(stt->lvc));
		for(i = 0; i < stt->nentries; i++)
		{
			printf("Id=%-5d (%d) ", stt->idbase+i, stt->entries[i].id);
			if(stt->entries[i].str)
				print_string(stt->entries[i].str);
			else
				printf("<none>");
			printf("\n");
		}
		printf("}\n");
	}
}

/*
 *****************************************************************************
 * Function	: dump_control
520
 * Syntax	: void dump_control(const control_t *ctrl)
Alexandre Julliard's avatar
Alexandre Julliard committed
521 522 523 524 525 526 527
 * Input	:
 *	ctrl	- Control resource descriptor
 * Output	:
 * Description	:
 * Remarks	:
 *****************************************************************************
*/
528
static void dump_control(const control_t *ctrl)
Alexandre Julliard's avatar
Alexandre Julliard committed
529 530
{
	printf("Control {\n\tClass: %s\n", get_nameid_str(ctrl->ctlclass));
531
	printf("\tText: "); get_nameid_str(ctrl->title); printf("\n");
Alexandre Julliard's avatar
Alexandre Julliard committed
532 533 534
	printf("\tId: %d\n", ctrl->id);
	printf("\tx, y, w, h: %d, %d, %d, %d\n", ctrl->x, ctrl->y, ctrl->width, ctrl->height);
	if(ctrl->gotstyle)
535 536 537
	{
		assert(ctrl->style != NULL);
		assert(ctrl->style->and_mask == 0);
538
		printf("\tStyle: %08x\n", ctrl->style->or_mask);
539
	}
Alexandre Julliard's avatar
Alexandre Julliard committed
540
	if(ctrl->gotexstyle)
541 542 543
	{
		assert(ctrl->exstyle != NULL);
		assert(ctrl->exstyle->and_mask == 0);
544
		printf("\tExStyle: %08x\n", ctrl->exstyle->or_mask);
545
	}
Alexandre Julliard's avatar
Alexandre Julliard committed
546
	if(ctrl->gothelpid)
547
		printf("\tHelpid: %d\n", ctrl->helpid);
Alexandre Julliard's avatar
Alexandre Julliard committed
548 549 550 551 552 553 554 555 556 557 558
	if(ctrl->extra)
	{
		printf("\t");
		dump_raw_data(ctrl->extra);
	}
	printf("}\n");
}

/*
 *****************************************************************************
 * Function	: dump_dialog
559
 * Syntax	: void dump_dialog(const dialog_t *dlg)
Alexandre Julliard's avatar
Alexandre Julliard committed
560 561 562 563 564 565 566
 * Input	:
 *	dlg	- Dialog resource descriptor
 * Output	:
 * Description	:
 * Remarks	:
 *****************************************************************************
*/
567
static void dump_dialog(const dialog_t *dlg)
Alexandre Julliard's avatar
Alexandre Julliard committed
568 569 570 571 572 573 574
{
	control_t *c = dlg->controls;

	dump_memopt(dlg->memopt);
	dump_lvc(&(dlg->lvc));
	printf("x, y, w, h: %d, %d, %d, %d\n", dlg->x, dlg->y, dlg->width, dlg->height);
	if(dlg->gotstyle)
575 576 577
	{
		assert(dlg->style != NULL);
		assert(dlg->style->and_mask == 0);
578
		printf("Style: %08x\n", dlg->style->or_mask);
579

580
	}
Alexandre Julliard's avatar
Alexandre Julliard committed
581
	if(dlg->gotexstyle)
582 583 584
	{
		assert(dlg->exstyle != NULL);
		assert(dlg->exstyle->and_mask == 0);
585
		printf("ExStyle: %08x\n", dlg->exstyle->or_mask);
586
	}
Alexandre Julliard's avatar
Alexandre Julliard committed
587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608
	printf("Menu: %s\n", get_nameid_str(dlg->menu));
	printf("Class: %s\n", get_nameid_str(dlg->dlgclass));
	printf("Title: "); print_string(dlg->title); printf("\n");
	printf("Font: ");
	if(!dlg->font)
		printf("<none>\n");
	else
	{
		printf("%d, ", dlg->font->size);
		print_string(dlg->font->name);
		printf("\n");
	}
	while(c)
	{
		dump_control(c);
		c = c->next;
	}
}

/*
 *****************************************************************************
 * Function	: dump_menu_item
609
 * Syntax	: void dump_menu_item(const menuex_item_t *item)
Alexandre Julliard's avatar
Alexandre Julliard committed
610 611 612 613 614 615
 * Input	:
 * Output	:
 * Description	:
 * Remarks	:
 *****************************************************************************
*/
616
static void dump_menu_item(const menu_item_t *item)
Alexandre Julliard's avatar
Alexandre Julliard committed
617 618 619 620 621 622 623
{
	while(item)
	{
		if(item->popup)
		{
			printf("POPUP ");
			print_string(item->name);
624 625 626 627 628 629 630 631
			if(item->gotid)
				printf(", Id=%d", item->id);
			if(item->gottype)
				printf(", Type=%d", item->type);
			if(item->gotstate)
				printf(", State=%08x", item->state);
			if(item->gothelpid)
				printf(", HelpId=%d", item->helpid);
Alexandre Julliard's avatar
Alexandre Julliard committed
632 633 634 635 636 637 638 639 640
			printf("\n");
			dump_menu_item(item->popup);
		}
		else
		{
			printf("MENUITEM ");
			if(item->name)
			{
				print_string(item->name);
641 642 643 644 645 646 647 648
				if(item->gotid)
					printf(", Id=%d", item->id);
				if(item->gottype)
					printf(", Type=%d", item->type);
				if(item->gotstate)
					printf(", State=%08x", item->state);
				if(item->gothelpid)
					printf(", HelpId=%d", item->helpid);
Alexandre Julliard's avatar
Alexandre Julliard committed
649 650 651 652 653 654 655 656 657 658 659 660
			}
			else
				printf("SEPARATOR");
			printf("\n");
		}
		item = item->next;
	}
}

/*
 *****************************************************************************
 * Function	: dump_menu
661
 * Syntax	: void dump_menu(const menu_t *men)
Alexandre Julliard's avatar
Alexandre Julliard committed
662 663 664 665 666 667 668
 * Input	:
 *	men	- Menu resource descriptor
 * Output	:
 * Description	:
 * Remarks	:
 *****************************************************************************
*/
669
static void dump_menu(const menu_t *men)
Alexandre Julliard's avatar
Alexandre Julliard committed
670 671 672 673 674 675 676 677 678
{
	dump_memopt(men->memopt);
	dump_lvc(&(men->lvc));
	dump_menu_item(men->items);
}

/*
 *****************************************************************************
 * Function	: dump_ver_value
679
 * Syntax	: void dump_ver_value(const ver_value_t *val)
Alexandre Julliard's avatar
Alexandre Julliard committed
680 681 682 683 684 685
 * Input	:
 * Output	:
 * Description	:
 * Remarks	:
 *****************************************************************************
*/
686
static void dump_ver_block(const ver_block_t *);	/* Forward ref */
687

688
static void dump_ver_value(const ver_value_t *val)
Alexandre Julliard's avatar
Alexandre Julliard committed
689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715
{
	if(val->type == val_str)
	{
		printf("VALUE ");
		print_string(val->key);
		printf(" ");
		print_string(val->value.str);
		printf("\n");
	}
	else if(val->type == val_words)
	{
		int i;
		printf("VALUE");
		print_string(val->key);
		for(i = 0; i < val->value.words->nwords; i++)
			printf(" %04x", val->value.words->words[i]);
		printf("\n");
	}
	else if(val->type == val_block)
	{
		dump_ver_block(val->value.block);
	}
}

/*
 *****************************************************************************
 * Function	: dump_ver_block
716
 * Syntax	: void dump_ver_block(const ver_block_t *blk)
Alexandre Julliard's avatar
Alexandre Julliard committed
717 718 719 720 721 722
 * Input	:
 * Output	:
 * Description	:
 * Remarks	:
 *****************************************************************************
*/
723
static void dump_ver_block(const ver_block_t *blk)
Alexandre Julliard's avatar
Alexandre Julliard committed
724
{
725
	const ver_value_t *val = blk->values;
Alexandre Julliard's avatar
Alexandre Julliard committed
726 727 728 729 730 731 732 733 734 735 736 737 738 739
	printf("BLOCK ");
	print_string(blk->name);
	printf("\n{\n");
	while(val)
	{
		dump_ver_value(val);
		val = val->next;
	}
	printf("}\n");
}

/*
 *****************************************************************************
 * Function	: dump_versioninfo
740
 * Syntax	: void dump_versioninfo(const versioninfo_t *ver)
Alexandre Julliard's avatar
Alexandre Julliard committed
741 742 743 744 745 746 747
 * Input	:
 *	ver	- Versioninfo resource descriptor
 * Output	:
 * Description	:
 * Remarks	:
 *****************************************************************************
*/
748
static void dump_versioninfo(const versioninfo_t *ver)
Alexandre Julliard's avatar
Alexandre Julliard committed
749
{
750
	const ver_block_t *blk = ver->blocks;
Alexandre Julliard's avatar
Alexandre Julliard committed
751

752 753
	dump_lvc(&(ver->lvc));

Alexandre Julliard's avatar
Alexandre Julliard committed
754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782
	if(ver->gotit.fv)
		printf("FILEVERSION %04x, %04x, %04x, %04x\n",
			ver->filever_maj1,
			ver->filever_maj2,
			ver->filever_min1,
			ver->filever_min2);
	if(ver->gotit.pv)
		printf("PRODUCTVERSION %04x, %04x, %04x, %04x\n",
			ver->prodver_maj1,
			ver->prodver_maj2,
			ver->prodver_min1,
			ver->prodver_min2);
	if(ver->gotit.fo)
		printf("FILEOS %08x\n", ver->fileos);
	if(ver->gotit.ff)
		printf("FILEFLAGS %08x\n", ver->fileflags);
	if(ver->gotit.ffm)
		printf("FILEFLAGSMASK %08x\n", ver->fileflagsmask);
	if(ver->gotit.ft)
		printf("FILETYPE %08x\n", ver->filetype);
	if(ver->gotit.fst)
		printf("FILESUBTYPE %08x\n", ver->filesubtype);
	while(blk)
	{
		dump_ver_block(blk);
		blk = blk->next;
	}
}

783 784 785
/*
 *****************************************************************************
 * Function	: dump_toolbar_item
786
 * Syntax	: void dump_toolbar_item(const toolbar_item_t *item)
787 788 789 790 791 792
 * Input	:
 * Output	:
 * Description	:
 * Remarks	:
 *****************************************************************************
*/
793
static void dump_toolbar_items(const toolbar_item_t *items)
794 795 796 797 798 799 800 801 802
{
	while(items)
	{
	        if(items->id)
			printf("   BUTTON %d", items->id );
		else
	      		printf("   SEPARATOR");

		printf("\n");
803

804 805 806 807 808 809 810
		items = items->next;
	}
}

/*
 *****************************************************************************
 * Function	: dump_toolbar
811
 * Syntax	: void dump_toolbar(const toolbar_t *toolbar)
812 813 814 815 816 817 818
 * Input	:
 *	toolbar	- Toolbar resource descriptor
 * Output	:
 * Description	:
 * Remarks	:
 *****************************************************************************
*/
819
static void dump_toolbar(const toolbar_t *toolbar)
820 821 822 823 824 825
{
	dump_memopt(toolbar->memopt);
	dump_lvc(&(toolbar->lvc));
	dump_toolbar_items(toolbar->items);
}

826 827 828
/*
 *****************************************************************************
 * Function	: dump_dlginit
829
 * Syntax	: void dump_dlginit(const dlginit_t *dit)
830 831 832 833 834 835 836
 * Input	:
 *	dit	- DlgInit resource descriptor
 * Output	:
 * Description	:
 * Remarks	:
 *****************************************************************************
*/
837
static void dump_dlginit(const dlginit_t *dit)
838 839
{
	dump_memopt(dit->memopt);
840
	dump_lvc(&(dit->data->lvc));
841 842 843
	dump_raw_data(dit->data);
}

Alexandre Julliard's avatar
Alexandre Julliard committed
844 845 846
/*
 *****************************************************************************
 * Function	: dump_resources
847
 * Syntax	: void dump_resources(const resource_t *top)
Alexandre Julliard's avatar
Alexandre Julliard committed
848 849 850 851 852 853 854 855
 * Input	:
 *	top	- Top of the resource tree
 * Output	:
 *	nop
 * Description	: Dump the parsed resource-tree to stdout
 * Remarks	:
 *****************************************************************************
*/
856
void dump_resources(const resource_t *top)
Alexandre Julliard's avatar
Alexandre Julliard committed
857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907
{
	printf("Internal resource-tree dump:\n");
	while(top)
	{
		printf("Resource: %s\nId: %s\n",
		       get_typename(top),
		       get_nameid_str(top->name));
		switch(top->type)
		{
		case res_acc:
			dump_accelerator(top->res.acc);
			break;
		case res_bmp:
			dump_bitmap(top->res.bmp);
			break;
		case res_cur:
			dump_cursor(top->res.cur);
			break;
		case res_curg:
			dump_cursor_group(top->res.curg);
			break;
		case res_dlg:
			dump_dialog(top->res.dlg);
			break;
		case res_fnt:
			dump_font(top->res.fnt);
			break;
		case res_icog:
			dump_icon_group(top->res.icog);
			break;
		case res_ico:
			dump_icon(top->res.ico);
			break;
		case res_men:
			dump_menu(top->res.men);
			break;
		case res_rdt:
			dump_rcdata(top->res.rdt);
			break;
		case res_stt:
			dump_stringtable(top->res.stt);
			break;
		case res_usr:
			dump_user(top->res.usr);
			break;
		case res_msg:
			dump_messagetable(top->res.msg);
			break;
		case res_ver:
			dump_versioninfo(top->res.ver);
			break;
908 909 910
		case res_dlginit:
			dump_dlginit(top->res.dlgi);
			break;
911 912 913
		case res_toolbar:
			dump_toolbar(top->res.tbt);
			break;
914 915 916 917
		case res_anicur:
		case res_aniico:
			dump_ani_curico(top->res.ani);
			break;
Alexandre Julliard's avatar
Alexandre Julliard committed
918 919 920 921 922 923 924
		default:
			printf("Report this: Unknown resource type parsed %08x\n", top->type);
		}
		printf("\n");
		top = top->next;
	}
}