NOT YET PART OF SEAMONKEY:

* add command-line flag for verbose mode, which will soon not be the default
* now outputs to stdout
* added output for int64, uint64, and wchar
This commit is contained in:
coop%netscape.com 1999-02-04 00:31:59 +00:00
parent aae093350d
commit 5b67c2d922
2 changed files with 406 additions and 262 deletions

View File

@ -24,12 +24,48 @@
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include "prprf.h"
#define BASE_INDENT 3
PRBool
XPT_VDumpHeader(XPTHeader *header, const int indent);
PRBool
XPT_VDumpAnnotations(XPTAnnotation *ann, const int indent);
PRBool
XPT_VDumpInterfaceDirectoryEntry(XPTInterfaceDirectoryEntry *ide,
const int indent);
PRBool
XPT_VDumpInterfaceDescriptor(XPTInterfaceDescriptor *id, const int indent);
PRBool
XPT_VDumpMethodDescriptor(XPTMethodDescriptor *md, const int indent);
PRBool
XPT_DumpXPTString(XPTString *str);
PRBool
XPT_VDumpParamDescriptor(XPTParamDescriptor *pd, const int indent);
PRBool
XPT_VDumpTypeDescriptor(XPTTypeDescriptor *td, int indent);
PRBool
XPT_VDumpConstDescriptor(XPTConstDescriptor *cd, const int indent);
static void
xpt_dump_usage(char *argv[]) {
fprintf(stdout, "Usage: %s [-v] <filename.xpt>\n"
" -v verbose mode\n", argv[0]);
}
int
main(int argc, char **argv)
{
PRBool verbose_mode = PR_FALSE;
XPTState *state;
XPTCursor curs, *cursor = &curs;
XPTHeader *header;
@ -38,19 +74,37 @@ main(int argc, char **argv)
char *whole;
FILE *in;
if (argc != 2) {
fprintf(stderr, "Usage: %s <filename.xpt>\n"
" Dumps a typelib file to screen.\n", argv[0]);
switch (argc) {
case 2:
if (argv[1][0] == '-') {
xpt_dump_usage(argv);
return 1;
}
if (stat(argv[1], &file_stat) != 0) {
perror("FAILED: fstat");
return 1;
}
flen = file_stat.st_size;
in = fopen(argv[1], "r");
break;
case 3:
verbose_mode = PR_TRUE;
if (argv[1][0] != '-' || argv[1][1] != 'v') {
xpt_dump_usage(argv);
return 1;
}
if (stat(argv[2], &file_stat) != 0) {
perror("FAILED: fstat");
return 1;
}
flen = file_stat.st_size;
in = fopen(argv[2], "r");
break;
default:
xpt_dump_usage(argv);
return 1;
}
if (!in) {
perror("FAILED: fopen");
return 1;
@ -66,17 +120,25 @@ main(int argc, char **argv)
fread(whole, flen, 1, in);
state = XPT_NewXDRState(XPT_DECODE, whole, flen);
if (!XPT_MakeCursor(state, XPT_HEADER, 0, cursor)) {
fprintf(stderr, "MakeCursor failed\n");
fprintf(stdout, "MakeCursor failed\n");
return 1;
}
if (!XPT_DoHeader(cursor, &header)) {
fprintf(stderr, "DoHeader failed\n");
fprintf(stdout, "DoHeader failed\n");
return 1;
}
if (!XPT_DumpHeader(header, BASE_INDENT)) {
if (verbose_mode) {
if (!XPT_VDumpHeader(header, BASE_INDENT)) {
perror("FAILED: XPT_VDumpHeader");
return 1;
}
} else {
if (!XPT_VDumpHeader(header, BASE_INDENT)) {
perror("FAILED: XPT_DumpHeader");
return 1;
}
}
XPT_DestroyXDRState(state);
free(whole);
}
@ -87,39 +149,39 @@ main(int argc, char **argv)
}
PRBool
XPT_DumpHeader(XPTHeader *header, const int indent)
XPT_VDumpHeader(XPTHeader *header, const int indent)
{
int i;
fprintf(stderr, "%*sMagic beans: ", indent, " ");
fprintf(stdout, "%*sMagic beans: ", indent, " ");
for (i=0; i<16; i++) {
fprintf(stderr, "%02x", header->magic[i]);
fprintf(stdout, "%02x", header->magic[i]);
}
fprintf(stderr, "\n");
fprintf(stdout, "\n");
if (strncmp(header->magic, XPT_MAGIC, 16) == 0)
fprintf(stderr, "%*s PASSED\n", indent, " ");
fprintf(stdout, "%*s PASSED\n", indent, " ");
else
fprintf(stderr, "%*s FAILED\n", indent, " ");
fprintf(stderr, "%*sMajor version: %d\n", indent, " ",
fprintf(stdout, "%*s FAILED\n", indent, " ");
fprintf(stdout, "%*sMajor version: %d\n", indent, " ",
header->major_version);
fprintf(stderr, "%*sMinor version: %d\n", indent, " ",
fprintf(stdout, "%*sMinor version: %d\n", indent, " ",
header->minor_version);
fprintf(stderr, "%*s# of interfaces: %d\n", indent, " ",
fprintf(stdout, "%*s# of interfaces: %d\n", indent, " ",
header->num_interfaces);
fprintf(stderr, "%*sFile length: %d\n", indent, " ",
fprintf(stdout, "%*sFile length: %d\n", indent, " ",
header->file_length);
fprintf(stderr, "%*sData pool offset: %d\n", indent, " ",
fprintf(stdout, "%*sData pool offset: %d\n", indent, " ",
header->data_pool);
fprintf(stderr, "\n%*sAnnotations:\n", indent, " ");
if (!XPT_DumpAnnotations(header->annotations, indent*2))
fprintf(stdout, "\n%*sAnnotations:\n", indent, " ");
if (!XPT_VDumpAnnotations(header->annotations, indent*2))
return PR_FALSE;
fprintf(stderr, "\n%*sInterface Directory:\n", indent, " ");
fprintf(stdout, "\n%*sInterface Directory:\n", indent, " ");
for (i=0; i<header->num_interfaces; i++) {
fprintf(stderr, "%*sInterface #%d:\n", indent*2, " ", i);
fprintf(stdout, "%*sInterface #%d:\n", indent*2, " ", i);
if (!XPT_DumpInterfaceDirectoryEntry(&header->interface_directory[i],
if (!XPT_VDumpInterfaceDirectoryEntry(&header->interface_directory[i],
indent*3))
return PR_FALSE;
}
@ -128,45 +190,46 @@ XPT_DumpHeader(XPTHeader *header, const int indent)
}
PRBool
XPT_DumpAnnotations(XPTAnnotation *ann, const int indent)
XPT_VDumpAnnotations(XPTAnnotation *ann, const int indent)
{
int i = -1, j = 0;
int i = -1;
XPTAnnotation *last;
int new_indent = indent + BASE_INDENT;
do {
i++;
if (XPT_ANN_IS_PRIVATE(ann->flags)) {
fprintf(stderr, "%*sAnnotation #%d is private.\n",
fprintf(stdout, "%*sAnnotation #%d is private.\n",
indent, " ", i);
fprintf(stderr, "%*sCreator: ", new_indent, " ");
fprintf(stdout, "%*sCreator: ", new_indent, " ");
if (!XPT_DumpXPTString(ann->creator))
return PR_FALSE;
fprintf(stderr, "\n");
fprintf(stderr, "%*sPrivate Data: ", new_indent, " ");
fprintf(stdout, "\n");
fprintf(stdout, "%*sPrivate Data: ", new_indent, " ");
if (!XPT_DumpXPTString(ann->private_data))
return PR_FALSE;
fprintf(stderr, "\n");
fprintf(stdout, "\n");
} else {
fprintf(stderr, "%*sAnnotation #%d is empty.\n",
fprintf(stdout, "%*sAnnotation #%d is empty.\n",
indent, " ", i);
}
last = ann;
ann = ann->next;
} while (!XPT_ANN_IS_LAST(last->flags));
fprintf(stderr, "%*sAnnotation #%d is the last annotation.\n",
fprintf(stdout, "%*sAnnotation #%d is the last annotation.\n",
indent, " ", i);
return PR_TRUE;
}
PRBool
XPT_DumpInterfaceDirectoryEntry(XPTInterfaceDirectoryEntry *ide, const int indent)
XPT_VDumpInterfaceDirectoryEntry(XPTInterfaceDirectoryEntry *ide,
const int indent)
{
int new_indent = indent + BASE_INDENT;
fprintf(stderr, "%*sIID: "
fprintf(stdout, "%*sIID: "
"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\n", indent, " ",
(PRUint32) ide->iid.m0, (PRUint32) ide->iid.m1,(PRUint32) ide->iid.m2,
(PRUint32) ide->iid.m3[0], (PRUint32) ide->iid.m3[1],
@ -174,41 +237,41 @@ XPT_DumpInterfaceDirectoryEntry(XPTInterfaceDirectoryEntry *ide, const int inden
(PRUint32) ide->iid.m3[4], (PRUint32) ide->iid.m3[5],
(PRUint32) ide->iid.m3[6], (PRUint32) ide->iid.m3[7]);
fprintf(stderr, "%*sName: %s\n",
fprintf(stdout, "%*sName: %s\n",
indent, " ", ide->name);
fprintf(stderr, "%*sNamespace: %s\n",
fprintf(stdout, "%*sNamespace: %s\n",
indent, " ", ide->namespace);
fprintf(stderr, "%*sAddress of interface descriptor: %p\n",
fprintf(stdout, "%*sAddress of interface descriptor: %p\n",
indent, " ", ide->interface_descriptor);
fprintf(stderr, "%sDescriptor:\n", indent);
if (!XPT_DumpInterfaceDescriptor(&ide->interface_descriptor, new_indent))
fprintf(stdout, "%*sDescriptor:\n", indent, " ");
if (!XPT_VDumpInterfaceDescriptor(ide->interface_descriptor, new_indent))
return PR_FALSE;
return PR_TRUE;
}
PRBool
XPT_DumpInterfaceDescriptor(XPTInterfaceDescriptor *id, int indent)
XPT_VDumpInterfaceDescriptor(XPTInterfaceDescriptor *id, const int indent)
{
int i;
int new_indent = indent + BASE_INDENT;
int more_indent = new_indent + BASE_INDENT;
fprintf(stderr, "%*sOffset of parent interface (in data pool): %d\n",
fprintf(stdout, "%*sOffset of parent interface (in data pool): %p\n",
indent, " ", id->parent_interface);
fprintf(stderr, "%*s# of Method Descriptors: %d\n",
fprintf(stdout, "%*s# of Method Descriptors: %d\n",
indent, " ", id->num_methods);
for (i=0; i<id->num_methods; i++) {
fprintf(stderr, "%*sMethod #%d:\n", new_indent, " ", i);
if (!XPT_DumpMethodDescriptor(&id->method_descriptors[i], more_indent))
fprintf(stdout, "%*sMethod #%d:\n", new_indent, " ", i);
if (!XPT_VDumpMethodDescriptor(&id->method_descriptors[i], more_indent))
return PR_FALSE;
}
fprintf(stderr, "%*s# of Constant Descriptors: %d\n",
indent, id->num_constants);
fprintf(stdout, "%*s# of Constant Descriptors: %d\n",
indent, " ", id->num_constants);
for (i=0; i<id->num_constants; i++) {
fprintf(stderr, "%*sConstant #%d:\n", new_indent, " ", i);
if (!XPT_DumpConstDescriptor(&id->const_descriptors[i], more_indent))
fprintf(stdout, "%*sConstant #%d:\n", new_indent, " ", i);
if (!XPT_VDumpConstDescriptor(&id->const_descriptors[i], more_indent))
return PR_FALSE;
}
@ -216,55 +279,55 @@ XPT_DumpInterfaceDescriptor(XPTInterfaceDescriptor *id, int indent)
}
PRBool
XPT_DumpMethodDescriptor(XPTMethodDescriptor *md, int indent)
XPT_VDumpMethodDescriptor(XPTMethodDescriptor *md, const int indent)
{
int i;
int new_indent = indent + BASE_INDENT;
int more_indent = new_indent + BASE_INDENT;
fprintf(stderr, "%*sName: %s\n", indent, " ", md->name);
fprintf(stderr, "%*sIs Getter? ", indent, " ");
fprintf(stdout, "%*sName: %s\n", indent, " ", md->name);
fprintf(stdout, "%*sIs Getter? ", indent, " ");
if (XPT_MD_IS_GETTER(md->flags))
fprintf(stderr, "TRUE\n");
fprintf(stdout, "TRUE\n");
else
fprintf(stderr, "FALSE\n");
fprintf(stdout, "FALSE\n");
fprintf(stderr, "%*sIs Setter? ", indent, " ");
fprintf(stdout, "%*sIs Setter? ", indent, " ");
if (XPT_MD_IS_SETTER(md->flags))
fprintf(stderr, "TRUE\n");
fprintf(stdout, "TRUE\n");
else
fprintf(stderr, "FALSE\n");
fprintf(stdout, "FALSE\n");
fprintf(stderr, "%*sIs Varargs? ", indent, " ");
fprintf(stdout, "%*sIs Varargs? ", indent, " ");
if (XPT_MD_IS_VARARGS(md->flags))
fprintf(stderr, "TRUE\n");
fprintf(stdout, "TRUE\n");
else
fprintf(stderr, "FALSE\n");
fprintf(stdout, "FALSE\n");
fprintf(stderr, "%*sIs Constructor? ", indent, " ");
fprintf(stdout, "%*sIs Constructor? ", indent, " ");
if (XPT_MD_IS_CTOR(md->flags))
fprintf(stderr, "TRUE\n");
fprintf(stdout, "TRUE\n");
else
fprintf(stderr, "FALSE\n");
fprintf(stdout, "FALSE\n");
fprintf(stderr, "%*sIs Hidden? ", indent, " ");
fprintf(stdout, "%*sIs Hidden? ", indent, " ");
if (XPT_MD_IS_HIDDEN(md->flags))
fprintf(stderr, "TRUE\n");
fprintf(stdout, "TRUE\n");
else
fprintf(stderr, "FALSE\n");
fprintf(stdout, "FALSE\n");
fprintf(stderr, "%*s# of arguments: %d\n", indent, " ", md->num_args);
fprintf(stderr, "%*sParameter Descriptors:\n", indent, " ");
fprintf(stdout, "%*s# of arguments: %d\n", indent, " ", md->num_args);
fprintf(stdout, "%*sParameter Descriptors:\n", indent, " ");
for (i=0; i<md->num_args; i++) {
fprintf(stderr, "%*sParameter #%d:\n", new_indent, " ", i);
fprintf(stdout, "%*sParameter #%d:\n", new_indent, " ", i);
if (!XPT_DumpParamDescriptor(&md->params[i], more_indent))
if (!XPT_VDumpParamDescriptor(&md->params[i], more_indent))
return PR_FALSE;
}
fprintf(stderr, "%*sResult:\n", indent, " ");
if (!XPT_DumpParamDescriptor(md->result, new_indent))
fprintf(stdout, "%*sResult:\n", indent, " ");
if (!XPT_VDumpParamDescriptor(md->result, new_indent))
return PR_FALSE;
return PR_TRUE;
@ -275,76 +338,76 @@ XPT_DumpXPTString(XPTString *str)
{
int i;
for (i=0; i<str->length; i++) {
fprintf(stderr, "%c", str->bytes[i]);
fprintf(stdout, "%c", str->bytes[i]);
}
return PR_TRUE;
}
PRBool
XPT_DumpParamDescriptor(XPTParamDescriptor *pd, int indent)
XPT_VDumpParamDescriptor(XPTParamDescriptor *pd, const int indent)
{
int new_indent = indent + BASE_INDENT;
fprintf(stderr, "%*sIn Param? ", indent, " ");
fprintf(stdout, "%*sIn Param? ", indent, " ");
if (XPT_PD_IS_IN(pd->flags))
fprintf(stderr, "TRUE\n");
fprintf(stdout, "TRUE\n");
else
fprintf(stderr, "FALSE\n");
fprintf(stdout, "FALSE\n");
fprintf(stderr, "%*sOut Param? ", indent, " ");
fprintf(stdout, "%*sOut Param? ", indent, " ");
if (XPT_PD_IS_OUT(pd->flags))
fprintf(stderr, "TRUE\n");
fprintf(stdout, "TRUE\n");
else
fprintf(stderr, "FALSE\n");
fprintf(stdout, "FALSE\n");
fprintf(stderr, "%*sRetval? ", indent, " ");
fprintf(stdout, "%*sRetval? ", indent, " ");
if (XPT_PD_IS_RETVAL(pd->flags))
fprintf(stderr, "TRUE\n");
fprintf(stdout, "TRUE\n");
else
fprintf(stderr, "FALSE\n");
fprintf(stdout, "FALSE\n");
fprintf(stderr, "%*sType Descriptor:\n", indent, " ");
if (!XPT_DumpTypeDescriptor(&pd->type, new_indent))
fprintf(stdout, "%*sType Descriptor:\n", indent, " ");
if (!XPT_VDumpTypeDescriptor(&pd->type, new_indent))
return PR_FALSE;
return PR_TRUE;
}
PRBool
XPT_DumpTypeDescriptor(XPTTypeDescriptor *td, int indent)
XPT_VDumpTypeDescriptor(XPTTypeDescriptor *td, int indent)
{
int new_indent = indent + BASE_INDENT;
fprintf(stderr, "%*sIs Pointer? ", indent, " ");
fprintf(stdout, "%*sIs Pointer? ", indent, " ");
if (XPT_TDP_IS_POINTER(td->prefix.flags))
fprintf(stderr, "TRUE\n");
fprintf(stdout, "TRUE\n");
else
fprintf(stderr, "FALSE\n");
fprintf(stdout, "FALSE\n");
fprintf(stderr, "%*sIs Unique Pointer? ", indent, " ");
fprintf(stdout, "%*sIs Unique Pointer? ", indent, " ");
if (XPT_TDP_IS_UNIQUE_POINTER(td->prefix.flags))
fprintf(stderr, "TRUE\n");
fprintf(stdout, "TRUE\n");
else
fprintf(stderr, "FALSE\n");
fprintf(stdout, "FALSE\n");
fprintf(stderr, "%*sIs Reference? ", indent, " ");
fprintf(stdout, "%*sIs Reference? ", indent, " ");
if (XPT_TDP_IS_REFERENCE(td->prefix.flags))
fprintf(stderr, "TRUE\n");
fprintf(stdout, "TRUE\n");
else
fprintf(stderr, "FALSE\n");
fprintf(stdout, "FALSE\n");
fprintf(stderr, "%*sTag: %d\n", indent, " ",
fprintf(stdout, "%*sTag: %d\n", indent, " ",
XPT_TDP_TAG(td->prefix));
if (XPT_TDP_TAG(td->prefix) == TD_INTERFACE_TYPE) {
fprintf(stderr, "%*sInterfaceTypeDescriptor:\n", indent, " ");
fprintf(stderr, "%*sIndex of IDE: %d\n", new_indent, " ",
fprintf(stdout, "%*sInterfaceTypeDescriptor:\n", indent, " ");
fprintf(stdout, "%*sIndex of IDE: %d\n", new_indent, " ",
td->type.interface);
}
if (XPT_TDP_TAG(td->prefix) == TD_INTERFACE_IS_TYPE) {
fprintf(stderr, "%*sInterfaceTypeDescriptor:\n", indent, " ");
fprintf(stderr, "%*sIndex of Method Argument: %d\n", new_indent, " ",
fprintf(stdout, "%*sInterfaceTypeDescriptor:\n", indent, " ");
fprintf(stdout, "%*sIndex of Method Argument: %d\n", new_indent, " ",
td->type.argnum);
}
@ -352,65 +415,70 @@ XPT_DumpTypeDescriptor(XPTTypeDescriptor *td, int indent)
}
PRBool
XPT_DumpConstDescriptor(XPTConstDescriptor *cd, int indent)
XPT_VDumpConstDescriptor(XPTConstDescriptor *cd, const int indent)
{
int new_indent = indent + BASE_INDENT;
char *out;
fprintf(stderr, "%*sName: %s\n", indent, " ", cd->name);
fprintf(stderr, "%*sType Descriptor: \n", " ", indent);
if (!XPT_DumpTypeDescriptor(&cd->type, new_indent))
fprintf(stdout, "%*sName: %s\n", indent, " ", cd->name);
fprintf(stdout, "%*sType Descriptor: \n", indent, " ");
if (!XPT_VDumpTypeDescriptor(&cd->type, new_indent))
return PR_FALSE;
fprintf(stderr, "%*sValue: ", indent, " ");
fprintf(stdout, "%*sValue: ", indent, " ");
switch(XPT_TDP_TAG(cd->type.prefix)) {
case TD_INT8:
fprintf(stderr, "%d\n", cd->value.i8);
fprintf(stdout, "%d\n", cd->value.i8);
break;
case TD_INT16:
fprintf(stderr, "%d\n", cd->value.i16);
fprintf(stdout, "%d\n", cd->value.i16);
break;
case TD_INT32:
fprintf(stderr, "%d\n", cd->value.i32);
fprintf(stdout, "%d\n", cd->value.i32);
break;
case TD_INT64:
fprintf(stderr, "%d\n", cd->value.i64);
out = PR_smprintf("%lld\n", cd->value.i64);
fputs(out, stdout);
PR_smprintf_free(out);
break;
case TD_UINT8:
fprintf(stderr, "%d\n", cd->value.ui8);
fprintf(stdout, "%d\n", cd->value.ui8);
break;
case TD_UINT16:
fprintf(stderr, "%d\n", cd->value.ui16);
fprintf(stdout, "%d\n", cd->value.ui16);
break;
case TD_UINT32:
fprintf(stderr, "%d\n", cd->value.ui32);
fprintf(stdout, "%d\n", cd->value.ui32);
break;
case TD_UINT64:
fprintf(stderr, "%d\n", cd->value.ui64);
out = PR_smprintf("%lld\n", cd->value.ui64);
fputs(out, stdout);
PR_smprintf_free(out);
break;
case TD_FLOAT:
fprintf(stderr, "%f\n", cd->value.flt);
fprintf(stdout, "%f\n", cd->value.flt);
break;
case TD_DOUBLE:
fprintf(stderr, "%g\n", cd->value.dbl);
fprintf(stdout, "%g\n", cd->value.dbl);
break;
case TD_BOOL:
if (cd->value.bul)
fprintf(stderr, "TRUE\n");
fprintf(stdout, "TRUE\n");
else
fprintf(stderr, "FALSE\n");
fprintf(stdout, "FALSE\n");
break;
case TD_CHAR:
fprintf(stderr, "%d\n", cd->value.ui64);
fprintf(stdout, "%c\n", cd->value.ch);
break;
case TD_WCHAR:
fprintf(stderr, "%d\n", cd->value.ui64);
fprintf(stdout, "%d\n", cd->value.wch);
break;
case TD_VOID:
fprintf(stderr, "VOID\n");
fprintf(stdout, "VOID\n");
break;
case TD_PPNSIID:
if (XPT_TDP_IS_POINTER(cd->type.prefix.flags)) {
fprintf(stderr, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
fprintf(stdout, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
cd->value.iid->m0, (PRUint32) cd->value.iid->m1,
(PRUint32) cd->value.iid->m2,
(PRUint32) cd->value.iid->m3[0],
@ -428,19 +496,23 @@ XPT_DumpConstDescriptor(XPTConstDescriptor *cd, int indent)
if (XPT_TDP_IS_POINTER(cd->type.prefix.flags)) {
if (!XPT_DumpXPTString(cd->value.string))
return PR_FALSE;
fprintf(stderr, "\n");
fprintf(stdout, "\n");
} else
return PR_FALSE;
break;
case TD_PSTRING:
if (XPT_TDP_IS_POINTER(cd->type.prefix.flags)) {
fprintf(stderr, "%s\n", cd->value.str);
fprintf(stdout, "%s\n", cd->value.str);
} else
return PR_FALSE;
break;
case TD_PWSTRING:
if (XPT_TDP_IS_POINTER(cd->type.prefix.flags)) {
fprintf(stderr, "%s\n", cd->value.wstr);
PRUint16 *ch = cd->value.wstr;
while (*ch) {
fprintf(stderr, "%c", *ch & 0xff);
ch++;
}
} else
return PR_FALSE;
break;

View File

@ -24,12 +24,48 @@
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include "prprf.h"
#define BASE_INDENT 3
PRBool
XPT_VDumpHeader(XPTHeader *header, const int indent);
PRBool
XPT_VDumpAnnotations(XPTAnnotation *ann, const int indent);
PRBool
XPT_VDumpInterfaceDirectoryEntry(XPTInterfaceDirectoryEntry *ide,
const int indent);
PRBool
XPT_VDumpInterfaceDescriptor(XPTInterfaceDescriptor *id, const int indent);
PRBool
XPT_VDumpMethodDescriptor(XPTMethodDescriptor *md, const int indent);
PRBool
XPT_DumpXPTString(XPTString *str);
PRBool
XPT_VDumpParamDescriptor(XPTParamDescriptor *pd, const int indent);
PRBool
XPT_VDumpTypeDescriptor(XPTTypeDescriptor *td, int indent);
PRBool
XPT_VDumpConstDescriptor(XPTConstDescriptor *cd, const int indent);
static void
xpt_dump_usage(char *argv[]) {
fprintf(stdout, "Usage: %s [-v] <filename.xpt>\n"
" -v verbose mode\n", argv[0]);
}
int
main(int argc, char **argv)
{
PRBool verbose_mode = PR_FALSE;
XPTState *state;
XPTCursor curs, *cursor = &curs;
XPTHeader *header;
@ -38,19 +74,37 @@ main(int argc, char **argv)
char *whole;
FILE *in;
if (argc != 2) {
fprintf(stderr, "Usage: %s <filename.xpt>\n"
" Dumps a typelib file to screen.\n", argv[0]);
switch (argc) {
case 2:
if (argv[1][0] == '-') {
xpt_dump_usage(argv);
return 1;
}
if (stat(argv[1], &file_stat) != 0) {
perror("FAILED: fstat");
return 1;
}
flen = file_stat.st_size;
in = fopen(argv[1], "r");
break;
case 3:
verbose_mode = PR_TRUE;
if (argv[1][0] != '-' || argv[1][1] != 'v') {
xpt_dump_usage(argv);
return 1;
}
if (stat(argv[2], &file_stat) != 0) {
perror("FAILED: fstat");
return 1;
}
flen = file_stat.st_size;
in = fopen(argv[2], "r");
break;
default:
xpt_dump_usage(argv);
return 1;
}
if (!in) {
perror("FAILED: fopen");
return 1;
@ -66,17 +120,25 @@ main(int argc, char **argv)
fread(whole, flen, 1, in);
state = XPT_NewXDRState(XPT_DECODE, whole, flen);
if (!XPT_MakeCursor(state, XPT_HEADER, 0, cursor)) {
fprintf(stderr, "MakeCursor failed\n");
fprintf(stdout, "MakeCursor failed\n");
return 1;
}
if (!XPT_DoHeader(cursor, &header)) {
fprintf(stderr, "DoHeader failed\n");
fprintf(stdout, "DoHeader failed\n");
return 1;
}
if (!XPT_DumpHeader(header, BASE_INDENT)) {
if (verbose_mode) {
if (!XPT_VDumpHeader(header, BASE_INDENT)) {
perror("FAILED: XPT_VDumpHeader");
return 1;
}
} else {
if (!XPT_VDumpHeader(header, BASE_INDENT)) {
perror("FAILED: XPT_DumpHeader");
return 1;
}
}
XPT_DestroyXDRState(state);
free(whole);
}
@ -87,39 +149,39 @@ main(int argc, char **argv)
}
PRBool
XPT_DumpHeader(XPTHeader *header, const int indent)
XPT_VDumpHeader(XPTHeader *header, const int indent)
{
int i;
fprintf(stderr, "%*sMagic beans: ", indent, " ");
fprintf(stdout, "%*sMagic beans: ", indent, " ");
for (i=0; i<16; i++) {
fprintf(stderr, "%02x", header->magic[i]);
fprintf(stdout, "%02x", header->magic[i]);
}
fprintf(stderr, "\n");
fprintf(stdout, "\n");
if (strncmp(header->magic, XPT_MAGIC, 16) == 0)
fprintf(stderr, "%*s PASSED\n", indent, " ");
fprintf(stdout, "%*s PASSED\n", indent, " ");
else
fprintf(stderr, "%*s FAILED\n", indent, " ");
fprintf(stderr, "%*sMajor version: %d\n", indent, " ",
fprintf(stdout, "%*s FAILED\n", indent, " ");
fprintf(stdout, "%*sMajor version: %d\n", indent, " ",
header->major_version);
fprintf(stderr, "%*sMinor version: %d\n", indent, " ",
fprintf(stdout, "%*sMinor version: %d\n", indent, " ",
header->minor_version);
fprintf(stderr, "%*s# of interfaces: %d\n", indent, " ",
fprintf(stdout, "%*s# of interfaces: %d\n", indent, " ",
header->num_interfaces);
fprintf(stderr, "%*sFile length: %d\n", indent, " ",
fprintf(stdout, "%*sFile length: %d\n", indent, " ",
header->file_length);
fprintf(stderr, "%*sData pool offset: %d\n", indent, " ",
fprintf(stdout, "%*sData pool offset: %d\n", indent, " ",
header->data_pool);
fprintf(stderr, "\n%*sAnnotations:\n", indent, " ");
if (!XPT_DumpAnnotations(header->annotations, indent*2))
fprintf(stdout, "\n%*sAnnotations:\n", indent, " ");
if (!XPT_VDumpAnnotations(header->annotations, indent*2))
return PR_FALSE;
fprintf(stderr, "\n%*sInterface Directory:\n", indent, " ");
fprintf(stdout, "\n%*sInterface Directory:\n", indent, " ");
for (i=0; i<header->num_interfaces; i++) {
fprintf(stderr, "%*sInterface #%d:\n", indent*2, " ", i);
fprintf(stdout, "%*sInterface #%d:\n", indent*2, " ", i);
if (!XPT_DumpInterfaceDirectoryEntry(&header->interface_directory[i],
if (!XPT_VDumpInterfaceDirectoryEntry(&header->interface_directory[i],
indent*3))
return PR_FALSE;
}
@ -128,45 +190,46 @@ XPT_DumpHeader(XPTHeader *header, const int indent)
}
PRBool
XPT_DumpAnnotations(XPTAnnotation *ann, const int indent)
XPT_VDumpAnnotations(XPTAnnotation *ann, const int indent)
{
int i = -1, j = 0;
int i = -1;
XPTAnnotation *last;
int new_indent = indent + BASE_INDENT;
do {
i++;
if (XPT_ANN_IS_PRIVATE(ann->flags)) {
fprintf(stderr, "%*sAnnotation #%d is private.\n",
fprintf(stdout, "%*sAnnotation #%d is private.\n",
indent, " ", i);
fprintf(stderr, "%*sCreator: ", new_indent, " ");
fprintf(stdout, "%*sCreator: ", new_indent, " ");
if (!XPT_DumpXPTString(ann->creator))
return PR_FALSE;
fprintf(stderr, "\n");
fprintf(stderr, "%*sPrivate Data: ", new_indent, " ");
fprintf(stdout, "\n");
fprintf(stdout, "%*sPrivate Data: ", new_indent, " ");
if (!XPT_DumpXPTString(ann->private_data))
return PR_FALSE;
fprintf(stderr, "\n");
fprintf(stdout, "\n");
} else {
fprintf(stderr, "%*sAnnotation #%d is empty.\n",
fprintf(stdout, "%*sAnnotation #%d is empty.\n",
indent, " ", i);
}
last = ann;
ann = ann->next;
} while (!XPT_ANN_IS_LAST(last->flags));
fprintf(stderr, "%*sAnnotation #%d is the last annotation.\n",
fprintf(stdout, "%*sAnnotation #%d is the last annotation.\n",
indent, " ", i);
return PR_TRUE;
}
PRBool
XPT_DumpInterfaceDirectoryEntry(XPTInterfaceDirectoryEntry *ide, const int indent)
XPT_VDumpInterfaceDirectoryEntry(XPTInterfaceDirectoryEntry *ide,
const int indent)
{
int new_indent = indent + BASE_INDENT;
fprintf(stderr, "%*sIID: "
fprintf(stdout, "%*sIID: "
"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\n", indent, " ",
(PRUint32) ide->iid.m0, (PRUint32) ide->iid.m1,(PRUint32) ide->iid.m2,
(PRUint32) ide->iid.m3[0], (PRUint32) ide->iid.m3[1],
@ -174,41 +237,41 @@ XPT_DumpInterfaceDirectoryEntry(XPTInterfaceDirectoryEntry *ide, const int inden
(PRUint32) ide->iid.m3[4], (PRUint32) ide->iid.m3[5],
(PRUint32) ide->iid.m3[6], (PRUint32) ide->iid.m3[7]);
fprintf(stderr, "%*sName: %s\n",
fprintf(stdout, "%*sName: %s\n",
indent, " ", ide->name);
fprintf(stderr, "%*sNamespace: %s\n",
fprintf(stdout, "%*sNamespace: %s\n",
indent, " ", ide->namespace);
fprintf(stderr, "%*sAddress of interface descriptor: %p\n",
fprintf(stdout, "%*sAddress of interface descriptor: %p\n",
indent, " ", ide->interface_descriptor);
fprintf(stderr, "%sDescriptor:\n", indent);
if (!XPT_DumpInterfaceDescriptor(&ide->interface_descriptor, new_indent))
fprintf(stdout, "%*sDescriptor:\n", indent, " ");
if (!XPT_VDumpInterfaceDescriptor(ide->interface_descriptor, new_indent))
return PR_FALSE;
return PR_TRUE;
}
PRBool
XPT_DumpInterfaceDescriptor(XPTInterfaceDescriptor *id, int indent)
XPT_VDumpInterfaceDescriptor(XPTInterfaceDescriptor *id, const int indent)
{
int i;
int new_indent = indent + BASE_INDENT;
int more_indent = new_indent + BASE_INDENT;
fprintf(stderr, "%*sOffset of parent interface (in data pool): %d\n",
fprintf(stdout, "%*sOffset of parent interface (in data pool): %p\n",
indent, " ", id->parent_interface);
fprintf(stderr, "%*s# of Method Descriptors: %d\n",
fprintf(stdout, "%*s# of Method Descriptors: %d\n",
indent, " ", id->num_methods);
for (i=0; i<id->num_methods; i++) {
fprintf(stderr, "%*sMethod #%d:\n", new_indent, " ", i);
if (!XPT_DumpMethodDescriptor(&id->method_descriptors[i], more_indent))
fprintf(stdout, "%*sMethod #%d:\n", new_indent, " ", i);
if (!XPT_VDumpMethodDescriptor(&id->method_descriptors[i], more_indent))
return PR_FALSE;
}
fprintf(stderr, "%*s# of Constant Descriptors: %d\n",
indent, id->num_constants);
fprintf(stdout, "%*s# of Constant Descriptors: %d\n",
indent, " ", id->num_constants);
for (i=0; i<id->num_constants; i++) {
fprintf(stderr, "%*sConstant #%d:\n", new_indent, " ", i);
if (!XPT_DumpConstDescriptor(&id->const_descriptors[i], more_indent))
fprintf(stdout, "%*sConstant #%d:\n", new_indent, " ", i);
if (!XPT_VDumpConstDescriptor(&id->const_descriptors[i], more_indent))
return PR_FALSE;
}
@ -216,55 +279,55 @@ XPT_DumpInterfaceDescriptor(XPTInterfaceDescriptor *id, int indent)
}
PRBool
XPT_DumpMethodDescriptor(XPTMethodDescriptor *md, int indent)
XPT_VDumpMethodDescriptor(XPTMethodDescriptor *md, const int indent)
{
int i;
int new_indent = indent + BASE_INDENT;
int more_indent = new_indent + BASE_INDENT;
fprintf(stderr, "%*sName: %s\n", indent, " ", md->name);
fprintf(stderr, "%*sIs Getter? ", indent, " ");
fprintf(stdout, "%*sName: %s\n", indent, " ", md->name);
fprintf(stdout, "%*sIs Getter? ", indent, " ");
if (XPT_MD_IS_GETTER(md->flags))
fprintf(stderr, "TRUE\n");
fprintf(stdout, "TRUE\n");
else
fprintf(stderr, "FALSE\n");
fprintf(stdout, "FALSE\n");
fprintf(stderr, "%*sIs Setter? ", indent, " ");
fprintf(stdout, "%*sIs Setter? ", indent, " ");
if (XPT_MD_IS_SETTER(md->flags))
fprintf(stderr, "TRUE\n");
fprintf(stdout, "TRUE\n");
else
fprintf(stderr, "FALSE\n");
fprintf(stdout, "FALSE\n");
fprintf(stderr, "%*sIs Varargs? ", indent, " ");
fprintf(stdout, "%*sIs Varargs? ", indent, " ");
if (XPT_MD_IS_VARARGS(md->flags))
fprintf(stderr, "TRUE\n");
fprintf(stdout, "TRUE\n");
else
fprintf(stderr, "FALSE\n");
fprintf(stdout, "FALSE\n");
fprintf(stderr, "%*sIs Constructor? ", indent, " ");
fprintf(stdout, "%*sIs Constructor? ", indent, " ");
if (XPT_MD_IS_CTOR(md->flags))
fprintf(stderr, "TRUE\n");
fprintf(stdout, "TRUE\n");
else
fprintf(stderr, "FALSE\n");
fprintf(stdout, "FALSE\n");
fprintf(stderr, "%*sIs Hidden? ", indent, " ");
fprintf(stdout, "%*sIs Hidden? ", indent, " ");
if (XPT_MD_IS_HIDDEN(md->flags))
fprintf(stderr, "TRUE\n");
fprintf(stdout, "TRUE\n");
else
fprintf(stderr, "FALSE\n");
fprintf(stdout, "FALSE\n");
fprintf(stderr, "%*s# of arguments: %d\n", indent, " ", md->num_args);
fprintf(stderr, "%*sParameter Descriptors:\n", indent, " ");
fprintf(stdout, "%*s# of arguments: %d\n", indent, " ", md->num_args);
fprintf(stdout, "%*sParameter Descriptors:\n", indent, " ");
for (i=0; i<md->num_args; i++) {
fprintf(stderr, "%*sParameter #%d:\n", new_indent, " ", i);
fprintf(stdout, "%*sParameter #%d:\n", new_indent, " ", i);
if (!XPT_DumpParamDescriptor(&md->params[i], more_indent))
if (!XPT_VDumpParamDescriptor(&md->params[i], more_indent))
return PR_FALSE;
}
fprintf(stderr, "%*sResult:\n", indent, " ");
if (!XPT_DumpParamDescriptor(md->result, new_indent))
fprintf(stdout, "%*sResult:\n", indent, " ");
if (!XPT_VDumpParamDescriptor(md->result, new_indent))
return PR_FALSE;
return PR_TRUE;
@ -275,76 +338,76 @@ XPT_DumpXPTString(XPTString *str)
{
int i;
for (i=0; i<str->length; i++) {
fprintf(stderr, "%c", str->bytes[i]);
fprintf(stdout, "%c", str->bytes[i]);
}
return PR_TRUE;
}
PRBool
XPT_DumpParamDescriptor(XPTParamDescriptor *pd, int indent)
XPT_VDumpParamDescriptor(XPTParamDescriptor *pd, const int indent)
{
int new_indent = indent + BASE_INDENT;
fprintf(stderr, "%*sIn Param? ", indent, " ");
fprintf(stdout, "%*sIn Param? ", indent, " ");
if (XPT_PD_IS_IN(pd->flags))
fprintf(stderr, "TRUE\n");
fprintf(stdout, "TRUE\n");
else
fprintf(stderr, "FALSE\n");
fprintf(stdout, "FALSE\n");
fprintf(stderr, "%*sOut Param? ", indent, " ");
fprintf(stdout, "%*sOut Param? ", indent, " ");
if (XPT_PD_IS_OUT(pd->flags))
fprintf(stderr, "TRUE\n");
fprintf(stdout, "TRUE\n");
else
fprintf(stderr, "FALSE\n");
fprintf(stdout, "FALSE\n");
fprintf(stderr, "%*sRetval? ", indent, " ");
fprintf(stdout, "%*sRetval? ", indent, " ");
if (XPT_PD_IS_RETVAL(pd->flags))
fprintf(stderr, "TRUE\n");
fprintf(stdout, "TRUE\n");
else
fprintf(stderr, "FALSE\n");
fprintf(stdout, "FALSE\n");
fprintf(stderr, "%*sType Descriptor:\n", indent, " ");
if (!XPT_DumpTypeDescriptor(&pd->type, new_indent))
fprintf(stdout, "%*sType Descriptor:\n", indent, " ");
if (!XPT_VDumpTypeDescriptor(&pd->type, new_indent))
return PR_FALSE;
return PR_TRUE;
}
PRBool
XPT_DumpTypeDescriptor(XPTTypeDescriptor *td, int indent)
XPT_VDumpTypeDescriptor(XPTTypeDescriptor *td, int indent)
{
int new_indent = indent + BASE_INDENT;
fprintf(stderr, "%*sIs Pointer? ", indent, " ");
fprintf(stdout, "%*sIs Pointer? ", indent, " ");
if (XPT_TDP_IS_POINTER(td->prefix.flags))
fprintf(stderr, "TRUE\n");
fprintf(stdout, "TRUE\n");
else
fprintf(stderr, "FALSE\n");
fprintf(stdout, "FALSE\n");
fprintf(stderr, "%*sIs Unique Pointer? ", indent, " ");
fprintf(stdout, "%*sIs Unique Pointer? ", indent, " ");
if (XPT_TDP_IS_UNIQUE_POINTER(td->prefix.flags))
fprintf(stderr, "TRUE\n");
fprintf(stdout, "TRUE\n");
else
fprintf(stderr, "FALSE\n");
fprintf(stdout, "FALSE\n");
fprintf(stderr, "%*sIs Reference? ", indent, " ");
fprintf(stdout, "%*sIs Reference? ", indent, " ");
if (XPT_TDP_IS_REFERENCE(td->prefix.flags))
fprintf(stderr, "TRUE\n");
fprintf(stdout, "TRUE\n");
else
fprintf(stderr, "FALSE\n");
fprintf(stdout, "FALSE\n");
fprintf(stderr, "%*sTag: %d\n", indent, " ",
fprintf(stdout, "%*sTag: %d\n", indent, " ",
XPT_TDP_TAG(td->prefix));
if (XPT_TDP_TAG(td->prefix) == TD_INTERFACE_TYPE) {
fprintf(stderr, "%*sInterfaceTypeDescriptor:\n", indent, " ");
fprintf(stderr, "%*sIndex of IDE: %d\n", new_indent, " ",
fprintf(stdout, "%*sInterfaceTypeDescriptor:\n", indent, " ");
fprintf(stdout, "%*sIndex of IDE: %d\n", new_indent, " ",
td->type.interface);
}
if (XPT_TDP_TAG(td->prefix) == TD_INTERFACE_IS_TYPE) {
fprintf(stderr, "%*sInterfaceTypeDescriptor:\n", indent, " ");
fprintf(stderr, "%*sIndex of Method Argument: %d\n", new_indent, " ",
fprintf(stdout, "%*sInterfaceTypeDescriptor:\n", indent, " ");
fprintf(stdout, "%*sIndex of Method Argument: %d\n", new_indent, " ",
td->type.argnum);
}
@ -352,65 +415,70 @@ XPT_DumpTypeDescriptor(XPTTypeDescriptor *td, int indent)
}
PRBool
XPT_DumpConstDescriptor(XPTConstDescriptor *cd, int indent)
XPT_VDumpConstDescriptor(XPTConstDescriptor *cd, const int indent)
{
int new_indent = indent + BASE_INDENT;
char *out;
fprintf(stderr, "%*sName: %s\n", indent, " ", cd->name);
fprintf(stderr, "%*sType Descriptor: \n", " ", indent);
if (!XPT_DumpTypeDescriptor(&cd->type, new_indent))
fprintf(stdout, "%*sName: %s\n", indent, " ", cd->name);
fprintf(stdout, "%*sType Descriptor: \n", indent, " ");
if (!XPT_VDumpTypeDescriptor(&cd->type, new_indent))
return PR_FALSE;
fprintf(stderr, "%*sValue: ", indent, " ");
fprintf(stdout, "%*sValue: ", indent, " ");
switch(XPT_TDP_TAG(cd->type.prefix)) {
case TD_INT8:
fprintf(stderr, "%d\n", cd->value.i8);
fprintf(stdout, "%d\n", cd->value.i8);
break;
case TD_INT16:
fprintf(stderr, "%d\n", cd->value.i16);
fprintf(stdout, "%d\n", cd->value.i16);
break;
case TD_INT32:
fprintf(stderr, "%d\n", cd->value.i32);
fprintf(stdout, "%d\n", cd->value.i32);
break;
case TD_INT64:
fprintf(stderr, "%d\n", cd->value.i64);
out = PR_smprintf("%lld\n", cd->value.i64);
fputs(out, stdout);
PR_smprintf_free(out);
break;
case TD_UINT8:
fprintf(stderr, "%d\n", cd->value.ui8);
fprintf(stdout, "%d\n", cd->value.ui8);
break;
case TD_UINT16:
fprintf(stderr, "%d\n", cd->value.ui16);
fprintf(stdout, "%d\n", cd->value.ui16);
break;
case TD_UINT32:
fprintf(stderr, "%d\n", cd->value.ui32);
fprintf(stdout, "%d\n", cd->value.ui32);
break;
case TD_UINT64:
fprintf(stderr, "%d\n", cd->value.ui64);
out = PR_smprintf("%lld\n", cd->value.ui64);
fputs(out, stdout);
PR_smprintf_free(out);
break;
case TD_FLOAT:
fprintf(stderr, "%f\n", cd->value.flt);
fprintf(stdout, "%f\n", cd->value.flt);
break;
case TD_DOUBLE:
fprintf(stderr, "%g\n", cd->value.dbl);
fprintf(stdout, "%g\n", cd->value.dbl);
break;
case TD_BOOL:
if (cd->value.bul)
fprintf(stderr, "TRUE\n");
fprintf(stdout, "TRUE\n");
else
fprintf(stderr, "FALSE\n");
fprintf(stdout, "FALSE\n");
break;
case TD_CHAR:
fprintf(stderr, "%d\n", cd->value.ui64);
fprintf(stdout, "%c\n", cd->value.ch);
break;
case TD_WCHAR:
fprintf(stderr, "%d\n", cd->value.ui64);
fprintf(stdout, "%d\n", cd->value.wch);
break;
case TD_VOID:
fprintf(stderr, "VOID\n");
fprintf(stdout, "VOID\n");
break;
case TD_PPNSIID:
if (XPT_TDP_IS_POINTER(cd->type.prefix.flags)) {
fprintf(stderr, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
fprintf(stdout, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
cd->value.iid->m0, (PRUint32) cd->value.iid->m1,
(PRUint32) cd->value.iid->m2,
(PRUint32) cd->value.iid->m3[0],
@ -428,19 +496,23 @@ XPT_DumpConstDescriptor(XPTConstDescriptor *cd, int indent)
if (XPT_TDP_IS_POINTER(cd->type.prefix.flags)) {
if (!XPT_DumpXPTString(cd->value.string))
return PR_FALSE;
fprintf(stderr, "\n");
fprintf(stdout, "\n");
} else
return PR_FALSE;
break;
case TD_PSTRING:
if (XPT_TDP_IS_POINTER(cd->type.prefix.flags)) {
fprintf(stderr, "%s\n", cd->value.str);
fprintf(stdout, "%s\n", cd->value.str);
} else
return PR_FALSE;
break;
case TD_PWSTRING:
if (XPT_TDP_IS_POINTER(cd->type.prefix.flags)) {
fprintf(stderr, "%s\n", cd->value.wstr);
PRUint16 *ch = cd->value.wstr;
while (*ch) {
fprintf(stderr, "%c", *ch & 0xff);
ch++;
}
} else
return PR_FALSE;
break;