From 5b67c2d92205f64bccc225ed64b6efd3e16cdf26 Mon Sep 17 00:00:00 2001 From: "coop%netscape.com" Date: Thu, 4 Feb 1999 00:31:59 +0000 Subject: [PATCH] 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 --- xpcom/libxpt/tools/xpt_dump.c | 334 ++++++++++++++++++----------- xpcom/typelib/xpt/tools/xpt_dump.c | 334 ++++++++++++++++++----------- 2 files changed, 406 insertions(+), 262 deletions(-) diff --git a/xpcom/libxpt/tools/xpt_dump.c b/xpcom/libxpt/tools/xpt_dump.c index 6a4d6a406926..88689c744c18 100644 --- a/xpcom/libxpt/tools/xpt_dump.c +++ b/xpcom/libxpt/tools/xpt_dump.c @@ -24,12 +24,48 @@ #include #include #include +#include +#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] \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 \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 (stat(argv[1], &file_stat) != 0) { - perror("FAILED: fstat"); - return 1; - } - flen = file_stat.st_size; - - in = fopen(argv[1], "r"); 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)) { - perror("FAILED: XPT_DumpHeader"); - return 1; + 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; inum_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; inum_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; inum_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; inum_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; ilength; 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; diff --git a/xpcom/typelib/xpt/tools/xpt_dump.c b/xpcom/typelib/xpt/tools/xpt_dump.c index 6a4d6a406926..88689c744c18 100644 --- a/xpcom/typelib/xpt/tools/xpt_dump.c +++ b/xpcom/typelib/xpt/tools/xpt_dump.c @@ -24,12 +24,48 @@ #include #include #include +#include +#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] \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 \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 (stat(argv[1], &file_stat) != 0) { - perror("FAILED: fstat"); - return 1; - } - flen = file_stat.st_size; - - in = fopen(argv[1], "r"); 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)) { - perror("FAILED: XPT_DumpHeader"); - return 1; + 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; inum_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; inum_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; inum_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; inum_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; ilength; 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;