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
16 static const char *
get_type(type_code type)17 get_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
79 int
main(int argc,char * argv[])80 main(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