1/*
2 * Copyright 2006, Axel D��rfler, axeld@pinc-software.de.
3 * Distributed under the terms of the MIT license.
4 */
5
6
7#include <File.h>
8#include <Mime.h>
9#include <Resources.h>
10#include <TypeConstants.h>
11
12#include <stdio.h>
13#include <string.h>
14
15
16static const char *
17get_type(type_code type)
18{
19	static char buffer[32];
20
21	switch (type) {
22		case B_MIME_STRING_TYPE:
23			return "MIME String";
24		case B_RAW_TYPE:
25			return "Raw Data";
26
27		case B_STRING_TYPE:
28			return "Text";
29		case B_INT64_TYPE:
30			return "Int-64";
31		case B_UINT64_TYPE:
32			return "Uint-64";
33		case B_INT32_TYPE:
34			return "Int-32";
35		case B_UINT32_TYPE:
36			return "Uint-32";
37		case B_INT16_TYPE:
38			return "Int-16";
39		case B_UINT16_TYPE:
40			return "Uint-16";
41		case B_INT8_TYPE:
42			return "Int-8";
43		case B_UINT8_TYPE:
44			return "Uint-8";
45		case B_BOOL_TYPE:
46			return "Boolean";
47		case B_FLOAT_TYPE:
48			return "Float";
49		case B_DOUBLE_TYPE:
50			return "Double";
51
52		case B_MINI_ICON_TYPE:
53			return "Mini Icon";
54		case B_LARGE_ICON_TYPE:
55			return "Icon";
56
57		default:
58		{
59			int32 missed = 0, shift = 24;
60			uint8 value[4];
61			for (int32 i = 0; i < 4; i++, shift -= 8) {
62				value[i] = uint8(type >> shift);
63				if (value[i] < ' ' || value[i] > 127) {
64					value[i] = '.';
65					missed++;
66				}
67			}
68
69			if (missed < 2)
70				sprintf(buffer, "'%c%c%c%c'", value[0], value[1], value[2], value[3]);
71			else
72				sprintf(buffer, "0x%08" B_PRIx32, type);
73			return buffer;
74		}
75	}
76}
77
78
79int
80main(int argc, char *argv[])
81{
82	const char *program = strrchr(argv[0], '/');
83	if (program == NULL)
84		program = argv[0];
85	else
86		program++;
87
88	if (argc < 2 || !strcmp(argv[1], "--help") || !strcmp(argv[1], "-h")) {
89		printf("usage: %s <filename> [<filename> ...]\n", program);
90		return 1;
91	}
92
93	off_t total = 0;
94
95	for (int i = 1; i < argc; ++i) {
96		BFile file(argv[i], B_READ_ONLY);
97
98		status_t status = file.InitCheck();
99		if (status < B_OK) {
100			fprintf(stderr, "%s: opening file failed for \"%s\": %s\n",
101				program, argv[i], strerror(status));
102			return 1;
103		}
104
105		BResources resources;
106		status = resources.SetTo(&file);
107		if (status != B_OK) {
108			fprintf(stderr, "%s: opening resources failed for \"%s\": %s\n",
109				program, argv[i], strerror(status));
110			return 1;
111		}
112
113		printf("File: %s\n", argv[i]);
114		printf("  Type         ID     Size                 Name\n");
115		printf("-----------  -----  --------  -------------------------------\n");
116
117		int32 index = 0;
118		const char* name;
119		type_code type;
120		size_t size;
121		int32 id;
122		while (resources.GetResourceInfo(index++, &type, &id, &name, &size)) {
123			printf("%11s %6" B_PRId32 " %9ld  \"%s\"\n",
124				get_type(type), id, size, name);
125
126			total += size;
127		}
128	}
129
130	printf("\n%" B_PRIdOFF " bytes total in resources.\n", total);
131	return 0;
132}
133