source: trunk/tools/SDF/sdf.c@ 3669

Last change on this file since 3669 was 2027, checked in by bird, 26 years ago

Initial hacking.

File size: 9.4 KB
Line 
1/* $Id: sdf.c,v 1.1 1999-12-09 00:38:32 bird Exp $
2 *
3 * SDF dumper. SDF == Structur Definition Files.
4 * SDF files are found with the PMDF utility.
5 * Note: SDFs for Warp 45 have to be UNPACK.EXEed first.
6 *
7 * stdout: log
8 * stderr: errors or "header" file.
9 *
10 * Copyright (c) 1999 knut st. osmundsen
11 *
12 * Project Odin Software License can be found in LICENSE.TXT
13 *
14 */
15
16/*******************************************************************************
17* Header Files *
18*******************************************************************************/
19#include <os2.h>
20#include <stdio.h>
21#include <string.h>
22#include <malloc.h>
23#include <assert.h>
24
25
26/*******************************************************************************
27* Structures and Typedefs *
28*******************************************************************************/
29typedef struct _SDFType
30{
31 CHAR szName[33];
32 CHAR szStruct[34];
33 ULONG cb;
34 ULONG ulPointerLevel;
35 ULONG aul[8];
36} SDFTYPE, *PSDFTYPE;
37
38typedef struct _SDFMember
39{
40 CHAR szName[33];
41 CHAR szType[33];
42 CHAR szType2[34];
43 ULONG cb;
44 ULONG offset;
45 UCHAR ch1;
46 UCHAR ch2;
47 UCHAR ch3;
48 UCHAR chPointerLevel;
49 ULONG aul[5];
50} SDFMEMBER, *PSDFMEMBER;
51
52
53typedef struct _SDFStruct
54{
55 CHAR szName[68];
56 ULONG cb;
57 ULONG cMembers;
58 ULONG ul1;
59 USHORT us2a;
60 USHORT us2b;
61 ULONG ul3;
62 ULONG ul4;
63 ULONG ul5;
64 ULONG ul6;
65 SDFMEMBER aMembers[1];
66} SDFSTRUCT, *PSDFSTRUCT;
67
68
69typedef struct _SDFHeader
70{
71 ULONG cStructs;
72 ULONG cTypes;
73 ULONG ul[12];
74} SDFHEADER, *PSDFHEADER;
75
76
77/*@IntFunc**********************************************************************
78* Internal Functions *
79*******************************************************************************/
80void dumpSDF(void *pvFile, unsigned cbFile);
81int makeName(char *pszName, PSDFMEMBER pMember, PSDFHEADER pHdr, PSDFTYPE paTypes);
82void makeTypedefsForStruct(PSDFHEADER pHdr, PSDFTYPE paTypes, PSDFSTRUCT pStruct, FILE *phOut);
83void makeTypedefsForTypedef(PSDFHEADER pHdr, PSDFTYPE paTypes, PSDFTYPE pTypedef, FILE *phOut);
84PSDFTYPE sdfGetTypeArray(PSDFHEADER pHdr);
85PSDFTYPE sdfGetType(PSDFHEADER pHdr, PSDFTYPE paTypes, const char *pszType);
86
87
88int main(int argc, char **argv)
89{
90 FILE *phFile;
91 char szBuffer[512];
92 char szOutput[512];
93
94 if (argc != 2)
95 {
96 fprintf(stderr, "invalid parameter\n");
97 return 1;
98 }
99
100 phFile = fopen(argv[1], "r"); /*Note: not "rb"! */
101 if (phFile != NULL)
102 {
103 unsigned cbFile;
104 void *pvFile;
105
106 fseek(phFile, 0, SEEK_END);
107 cbFile = ftell(phFile);
108 fseek(phFile, 0, SEEK_SET);
109
110 pvFile = malloc(cbFile+20);
111 if (pvFile != NULL)
112 {
113 if (fread(pvFile, 1, cbFile, phFile))
114 {
115 dumpSDF(pvFile, cbFile);
116 }
117 else
118 fprintf(stderr, "fread failed\n");
119 }
120 else
121 fprintf(stderr, "malloc(%d) failed\n", cbFile);
122 fclose(phFile);
123 }
124 else
125 fprintf(stderr, "unable to open input file, %s\n", argv[1]);
126
127 return 0;
128}
129
130
131
132
133void dumpSDF(void *pvFile, unsigned cbFile)
134{
135 PSDFHEADER pHdr = (PSDFHEADER)pvFile;
136 PSDFSTRUCT pStruct = (PSDFSTRUCT)(unsigned)(pHdr + 1);
137 PSDFTYPE paTypes = sdfGetTypeArray(pHdr);
138 PSDFTYPE pType;
139 FILE *phOut = stderr;
140 int i;
141
142 printf("Header:\n"
143 "-------\n");
144 for (i = 0; i < sizeof(pHdr->ul) / sizeof(pHdr->ul[0]); i++)
145 printf("ul[%#x] = 0x%08x\n",
146 i, pHdr->ul[i]);
147
148 printf("\nStructs:\n"
149 "--------\n");
150 for (i = 0; i < pHdr->cStructs; i++,
151 pStruct = (PSDFSTRUCT)((unsigned)(pStruct+1) + sizeof(SDFMEMBER)*(pStruct->cMembers - 1)) )
152 {
153 int j;
154 if (i > 0)
155 printf("\n");
156 printf("%3d struct: %-20s #members: %3d cb: 0x%04x ",
157 i, pStruct->szName, pStruct->cMembers, pStruct->cb);
158 printf("ul1=%08x us2a=%04x us2b=%04x ul3=%08x ul4=%08x ul5=%08x ul6=%08x\n",
159 pStruct->ul1, pStruct->us2a, pStruct->us2b, pStruct->ul3, pStruct->ul4, pStruct->ul5, pStruct->ul6);
160 fprintf(phOut, "struct %s /* #memb %d size %d (0x%03x) */\n{\n",
161 pStruct->szName, pStruct->cMembers, pStruct->cb, pStruct->cb);
162
163 for (j = 0; j < pStruct->cMembers; j++)
164 {
165 int k, cchName;
166 char szName[80];
167 printf("\tname: %-18s type: %-14s size: %02x offset: %02x chPointerLevel: %d ch1-3:",
168 pStruct->aMembers[j].szName,
169 pStruct->aMembers[j].szType,
170 pStruct->aMembers[j].cb,
171 pStruct->aMembers[j].offset,
172 pStruct->aMembers[j].chPointerLevel
173 );
174 if (pStruct->aMembers[j].szType2[0] != '\0')
175 printf("\n\tszType2=%.15s\n", pStruct->aMembers[j].szType2);
176
177 makeName(szName, &pStruct->aMembers[j], pHdr, paTypes);
178 cchName = 20 - strlen(szName);
179 fprintf(phOut, " %-20s %s; %*s/* off: %3d(%02x) size: %2d(%02x) */\n",
180 pStruct->aMembers[j].szType,
181 szName,
182 cchName > 0 ? cchName : 0, "",
183 pStruct->aMembers[j].offset,
184 pStruct->aMembers[j].offset,
185 pStruct->aMembers[j].cb,
186 pStruct->aMembers[j].cb
187 );
188
189 printf(" %02X %02X %02X aul:", pStruct->aMembers[i].ch1, pStruct->aMembers[i].ch2, pStruct->aMembers[i].ch3);
190 for (k = 0; k < sizeof(pStruct->aMembers[j].aul) / sizeof(pStruct->aMembers[j].aul[0]); k++)
191 printf(" %08X", pStruct->aMembers[j].aul[k]);
192 printf("\n");
193 }
194 fprintf(phOut, "};\n");
195 makeTypedefsForStruct(pHdr, paTypes, pStruct, phOut);
196 fprintf(phOut, "\n\n");
197 }
198
199 fprintf(stderr, "\n/*debug: CurPos=0x%x cbFile=0x%x */\n",
200 (unsigned)pStruct - (unsigned)pvFile, cbFile);
201
202
203
204 printf("\nTypes:\n"
205 "------\n");
206 pType = (PSDFTYPE)(unsigned)pStruct;
207 assert(pType == paTypes);
208 for (i = 0; i < pHdr->cTypes; i++, pType++)
209 {
210 int j;
211 printf("%3d Name: %-20s Struct: %-20s cb: %3d (0x%03x) PointerLevel: %d ",
212 i,
213 pType->szName,
214 pType->szStruct[0] != '\0' ? pType->szStruct : "<none>",
215 pType->cb,
216 pType->cb,
217 pType->ulPointerLevel
218 );
219 for (j = 0; j < sizeof(pType->aul) / sizeof(pType->aul[0]); j++)
220 printf(" 0x%08x", pType->aul[j]);
221 printf("\n");
222 }
223
224 fprintf(stderr, "\n/*debug: CurPos=0x%x cbFile=0x%x */\n",
225 (unsigned)pType - (unsigned)pvFile, cbFile);
226}
227
228
229int makeName(char *pszName, PSDFMEMBER pMember, PSDFHEADER pHdr, PSDFTYPE paTypes)
230{
231 char * psz = pszName;
232 PSDFTYPE pType = sdfGetType(pHdr, paTypes, pMember->szType);
233
234 strcpy(pszName, " ");
235
236 if (pType != NULL && pMember->cb > pType->cb && (pType->cb > 0 || pMember->chPointerLevel > 0))
237 {
238 int i = 0;
239 int c = pMember->chPointerLevel - pType->ulPointerLevel;
240 for (i = 0; i < c; i++)
241 pszName[i] = '*';
242 pszName[i > 3 ? i : 3] = '\0';
243
244 psz = pszName + strlen(pszName);
245 if (c <= 0 && pType->cb > 0)
246 sprintf(psz, "%s[%d]", pMember->szName, pMember->cb / pType->cb);
247 else
248 sprintf(psz, "%s", pMember->szName);
249 }
250 else
251 strcat(pszName, pMember->szName);
252
253 return strlen(pszName);
254}
255
256void makeTypedefsForStruct(PSDFHEADER pHdr, PSDFTYPE paTypes, PSDFSTRUCT pStruct, FILE *phOut)
257{
258 int i;
259 for (i = 0; i < pHdr->cTypes; i++)
260 if (strcmp(paTypes[i].szStruct, pStruct->szName) == 0)
261 {
262 int j;
263 fprintf(phOut, "typedef struct %s ", pStruct->szName);
264 for (j = 0; j < paTypes[i].ulPointerLevel; j++)
265 fprintf(phOut, "*");
266 fprintf(phOut, " %s;\n", paTypes[i].szName);
267 makeTypedefsForTypedef(pHdr, paTypes, &paTypes[i], phOut);
268 }
269}
270
271void makeTypedefsForTypedef(PSDFHEADER pHdr, PSDFTYPE paTypes, PSDFTYPE pTypedef, FILE *phOut)
272{
273 int i;
274 for (i = 0; i < pHdr->cTypes; i++)
275 if (&paTypes[i] != pTypedef && strcmp(paTypes[i].szStruct, pTypedef->szName) == 0)
276 {
277 int j;
278 fprintf(phOut, "typedef %s ", pTypedef->szName);
279 for (j = 0; j < paTypes[i].ulPointerLevel; j++)
280 fprintf(phOut, "*");
281 fprintf(phOut, " %s;\n", paTypes[i].szName);
282 makeTypedefsForTypedef(pHdr, paTypes, &paTypes[i], phOut); /* a bit risky... */
283 }
284}
285
286
287
288
289PSDFTYPE sdfGetTypeArray(PSDFHEADER pHdr)
290{
291 PSDFSTRUCT pStruct = (PSDFSTRUCT)(unsigned)(pHdr + 1);
292 PSDFTYPE pType;
293 int i;
294
295 for (i = 0; i < pHdr->cStructs; i++)
296 pStruct = (PSDFSTRUCT)((unsigned)(pStruct+1) + sizeof(SDFMEMBER)*(pStruct->cMembers - 1));
297
298 return (PSDFTYPE)(unsigned)pStruct;
299}
300
301
302PSDFTYPE sdfGetType(PSDFHEADER pHdr, PSDFTYPE paTypes, const char *pszType)
303{
304 if (*pszType != '\0')
305 {
306 int i;
307 for (i = 0; i < pHdr->cTypes; i++)
308 if (strcmp(paTypes[i].szName, pszType) == 0)
309 return &paTypes[i];
310 }
311
312 return NULL;
313}
Note: See TracBrowser for help on using the repository browser.