diff --git a/mozilla/xpcom/libxpt/public/xpt_struct.h b/mozilla/xpcom/libxpt/public/xpt_struct.h index 85ab90ee0fa..bd81ffbc46d 100644 --- a/mozilla/xpcom/libxpt/public/xpt_struct.h +++ b/mozilla/xpcom/libxpt/public/xpt_struct.h @@ -188,6 +188,10 @@ struct XPTTypeDescriptorPrefix { #define XPT_TDP_TAGMASK (~XPT_TDP_FLAGMASK) #define XPT_TDP_TAG(tdp) ((tdp).flags & XPT_TDP_TAGMASK) +#define XPT_TDP_IS_POINTER(flags) (flags & XPT_TDP_POINTER) +#define XPT_TDP_IS_UNIQUE_POINTER(flags) (flags & XPT_TDP_UNIQUE_POINTER) +#define XPT_TDP_IS_REFERENCE(flags) (flags & XPT_TDP_REFERENCE) + /* XXX TD #defines should include required flag bits! */ /* @@ -280,17 +284,23 @@ struct XPTTypeDescriptor { * String record containing the constant string. */ union XPTConstValue { - int8 i8; - uint8 ui8; - int16 i16; - uint16 ui16; - int32 i32; - uint32 ui32; - int64 i64; - uint64 ui64; - uint16 wch; - char ch; - XPTString *string; + int8 i8; + uint8 ui8; + int16 i16; + uint16 ui16; + int32 i32; + uint32 ui32; + int64 i64; + uint64 ui64; + float flt; + double dbl; + PRBool bul; + char ch; + uint16 wch; + nsID *iid; + XPTString *string; + char *str; + uint16 *wstr; }; /* varies according to type */ struct XPTConstDescriptor { @@ -314,6 +324,10 @@ struct XPTParamDescriptor { #define XPT_PD_RETVAL 0x20 #define XPT_PD_FLAGMASK 0x70 +#define XPT_PD_IS_IN(flags) (flags & XPT_PD_IN) +#define XPT_PD_IS_OUT(flags) (flags & XPT_PD_OUT) +#define XPT_PD_IS_RETVAL(flags) (flags & XPT_PD_RETVAL) + #define XPT_PARAMDESCRIPTOR_SIZE (XPT_TYPEDESCRIPTOR_SIZE + 1) PRBool @@ -340,6 +354,12 @@ struct XPTMethodDescriptor { #define XPT_MD_HIDDEN 0x08 #define XPT_MD_FLAGMASK 0xf8 +#define XPT_MD_IS_GETTER(flags) (flags & XPT_MD_GETTER) +#define XPT_MD_IS_SETTER(flags) (flags & XPT_MD_SETTER) +#define XPT_MD_IS_VARARGS(flags) (flags & XPT_MD_VARARGS) +#define XPT_MD_IS_CTOR(flags) (flags & XPT_MD_CTOR) +#define XPT_MD_IS_HIDDEN(flags) (flags & XPT_MD_HIDDEN) + PRBool XPT_FillMethodDescriptor(XPTMethodDescriptor *meth, uint8 flags, char *name, uint8 num_args); diff --git a/mozilla/xpcom/libxpt/tests/SimpleTypeLib.c b/mozilla/xpcom/libxpt/tests/SimpleTypeLib.c index 598385d9cea..f0fc94522ab 100644 --- a/mozilla/xpcom/libxpt/tests/SimpleTypeLib.c +++ b/mozilla/xpcom/libxpt/tests/SimpleTypeLib.c @@ -42,6 +42,12 @@ #define DOUBLE_INDENT " " #define TRIPLE_INDENT " " #define QUAD_INDENT " " +#define QUINT_INDENT " " +#define SEXT_INDENT " " +#define SEPT_INDENT " " +#define OCT_INDENT " " +#define NONA_INDENT " " +#define DECA_INDENT " " struct nsID iid = { 0x00112233, @@ -136,7 +142,7 @@ main(int argc, char **argv) ok = XPT_DoHeader(cursor, &header); TRY("DoHeader", ok); - out = fopen(argv[1], "w"); + /* out = fopen(argv[1], "w"); if (!out) { perror("FAILED: fopen"); return 1; @@ -149,7 +155,7 @@ main(int argc, char **argv) fwrite(data, len, 1, out); fclose(out); XPT_DestroyXDRState(state); - + */ fprintf(stderr, "\n'%s' Header:\n", argv[1]); XPT_DumpHeader(header); @@ -180,37 +186,34 @@ XPT_DumpHeader(XPTHeader *header) PRBool XPT_DumpAnnotations(XPTAnnotation *ann) { - int i = 0, j = 0; + int i = -1, j = 0; XPTAnnotation *last; fprintf(stderr, "\n%sAnnotations:\n", INDENT); do { i++; - fprintf(stderr, "%sAnnotation #%d:\n", DOUBLE_INDENT, i); if (XPT_ANN_IS_PRIVATE(ann->flags)) { fprintf(stderr, "%sAnnotation #%d is private.\n", - TRIPLE_INDENT, i); - fprintf(stderr, "%sCreator: ", QUAD_INDENT); - for (j=0; jcreator->length; j++) { - fprintf(stderr, "%c", ann->creator->bytes[j]); - } + DOUBLE_INDENT, i); + fprintf(stderr, "%sCreator: ", TRIPLE_INDENT); + if (!XPT_DumpXPTString(ann->creator)) + return PR_FALSE; fprintf(stderr, "\n"); - fprintf(stderr, "%sPrivate Data: ", QUAD_INDENT); - for (j=0; jprivate_data->length; j++) { - fprintf(stderr, "%c", ann->private_data->bytes[j]); - } + fprintf(stderr, "%sPrivate Data: ", TRIPLE_INDENT); + if (!XPT_DumpXPTString(ann->private_data)) + return PR_FALSE; fprintf(stderr, "\n"); } else { fprintf(stderr, "%sAnnotation #%d is empty.\n", - TRIPLE_INDENT, i); + DOUBLE_INDENT, i); } last = ann; ann = ann->next; } while (!XPT_ANN_IS_LAST(last->flags)); fprintf(stderr, "%sAnnotation #%d is the last annotation.\n", - TRIPLE_INDENT, i); + DOUBLE_INDENT, i); return PR_TRUE; } @@ -222,7 +225,7 @@ XPT_DumpIDEs(XPTInterfaceDirectoryEntry *ide, int num_interfaces) fprintf(stderr, "\n%sInterface Directory:\n", INDENT); for (i=0; iname); fprintf(stderr, "%sNamespace: %s\n", TRIPLE_INDENT, ide->namespace); - fprintf(stderr, "%sAddress of interface descriptor: %d\n", + fprintf(stderr, "%sAddress of interface descriptor: %p\n", TRIPLE_INDENT, ide->interface_descriptor); + if (!XPT_DumpInterfaceDescriptor(ide->interface_descriptor)) + return PR_FALSE; } return PR_TRUE; } + +PRBool +XPT_DumpInterfaceDescriptor(XPTInterfaceDescriptor *id) +{ + int i; + + fprintf(stderr, "%sDescriptor:\n", TRIPLE_INDENT); + fprintf(stderr, "%sOffset of parent interface (in data pool): %d\n", + QUAD_INDENT, id->parent_interface); + fprintf(stderr, "%s# of Method Descriptors: %d\n", + QUAD_INDENT, id->num_methods); + for (i=0; inum_methods; i++) { + fprintf(stderr, "%sMethod #%d:\n", QUINT_INDENT, i); + if (!XPT_DumpMethodDescriptor(&id->method_descriptors[i])) + return PR_FALSE; + } + fprintf(stderr, "%s# of Constant Descriptors: %d\n", + QUAD_INDENT, id->num_constants); + for (i=0; inum_constants; i++) { + fprintf(stderr, "%sConstant #%d:\n", QUINT_INDENT, i); + if (!XPT_DumpConstDescriptor(&id->const_descriptors[i])) + return PR_FALSE; + } + + return PR_TRUE; +} + +PRBool +XPT_DumpMethodDescriptor(XPTMethodDescriptor *md) +{ + int i; + + fprintf(stderr, "%sName: %s\n", SEXT_INDENT, md->name); + fprintf(stderr, "%sIs Getter? ", SEXT_INDENT); + if (XPT_MD_IS_GETTER(md->flags)) + fprintf(stderr, "TRUE\n"); + else + fprintf(stderr, "FALSE\n"); + + fprintf(stderr, "%sIs Setter? ", SEXT_INDENT); + if (XPT_MD_IS_SETTER(md->flags)) + fprintf(stderr, "TRUE\n"); + else + fprintf(stderr, "FALSE\n"); + + fprintf(stderr, "%sIs Varargs? ", SEXT_INDENT); + if (XPT_MD_IS_VARARGS(md->flags)) + fprintf(stderr, "TRUE\n"); + else + fprintf(stderr, "FALSE\n"); + + fprintf(stderr, "%sIs Constructor? ", SEXT_INDENT); + if (XPT_MD_IS_CTOR(md->flags)) + fprintf(stderr, "TRUE\n"); + else + fprintf(stderr, "FALSE\n"); + + fprintf(stderr, "%sIs Hidden? ", SEXT_INDENT); + if (XPT_MD_IS_HIDDEN(md->flags)) + fprintf(stderr, "TRUE\n"); + else + fprintf(stderr, "FALSE\n"); + + fprintf(stderr, "%s# of arguments: %d\n", SEXT_INDENT, md->num_args); + fprintf(stderr, "%sParameter Descriptors:\n", SEXT_INDENT); + + for (i=0; inum_args; i++) { + fprintf(stderr, "%sParameter #%d:\n", SEPT_INDENT, i); + + if (!XPT_DumpParamDescriptor(&md->params[i])) + return PR_FALSE; + } + + fprintf(stderr, "%sResult:\n", SEXT_INDENT); + if (!XPT_DumpParamDescriptor(md->result)) + return PR_FALSE; + + return PR_TRUE; +} + +PRBool +XPT_DumpXPTString(XPTString *str) +{ + int i; + for (i=0; ilength; i++) { + fprintf(stderr, "%c", str->bytes[i]); + } + return PR_TRUE; +} + +PRBool +XPT_DumpParamDescriptor(XPTParamDescriptor *pd) +{ + fprintf(stderr, "%sIn Param? ", OCT_INDENT); + if (XPT_PD_IS_IN(pd->flags)) + fprintf(stderr, "TRUE\n"); + else + fprintf(stderr, "FALSE\n"); + + fprintf(stderr, "%sOut Param? ", OCT_INDENT); + if (XPT_PD_IS_OUT(pd->flags)) + fprintf(stderr, "TRUE\n"); + else + fprintf(stderr, "FALSE\n"); + + fprintf(stderr, "%sRetval? ", OCT_INDENT); + if (XPT_PD_IS_RETVAL(pd->flags)) + fprintf(stderr, "TRUE\n"); + else + fprintf(stderr, "FALSE\n"); + + fprintf(stderr, "%sType Descriptor:\n", OCT_INDENT); + if (!XPT_DumpTypeDescriptor(&pd->type)) + return PR_FALSE; + + return PR_TRUE; +} + +PRBool +XPT_DumpTypeDescriptor(XPTTypeDescriptor *td) +{ + fprintf(stderr, "%sIs Pointer? ", NONA_INDENT); + if (XPT_TDP_IS_POINTER(td->prefix.flags)) + fprintf(stderr, "TRUE\n"); + else + fprintf(stderr, "FALSE\n"); + + fprintf(stderr, "%sIs Unique Pointer? ", NONA_INDENT); + if (XPT_TDP_IS_UNIQUE_POINTER(td->prefix.flags)) + fprintf(stderr, "TRUE\n"); + else + fprintf(stderr, "FALSE\n"); + + fprintf(stderr, "%sIs Reference? ", NONA_INDENT); + if (XPT_TDP_IS_REFERENCE(td->prefix.flags)) + fprintf(stderr, "TRUE\n"); + else + fprintf(stderr, "FALSE\n"); + + fprintf(stderr, "%sTag: %d\n", NONA_INDENT, + XPT_TDP_TAG(td->prefix)); + + if (XPT_TDP_TAG(td->prefix) == TD_INTERFACE_TYPE) { + fprintf(stderr, "%sInterfaceTypeDescriptor:\n", NONA_INDENT); + fprintf(stderr, "%sIndex of IDE: %d\n", DECA_INDENT, + td->type.interface); + } + + if (XPT_TDP_TAG(td->prefix) == TD_INTERFACE_IS_TYPE) { + fprintf(stderr, "%sInterfaceTypeDescriptor:\n", NONA_INDENT); + fprintf(stderr, "%sIndex of Method Argument: %d\n", DECA_INDENT, + td->type.argnum); + } + + return PR_TRUE; +} + +PRBool +XPT_DumpConstDescriptor(XPTConstDescriptor *cd) +{ + fprintf(stderr, "%sName: %s\n", SEXT_INDENT, cd->name); + fprintf(stderr, "%sType Descriptor: \n", SEXT_INDENT); + if (!XPT_DumpTypeDescriptor(&cd->type)) + return PR_FALSE; + fprintf(stderr, "%sValue: ", SEXT_INDENT); + + switch(XPT_TDP_TAG(cd->type.prefix)) { + case TD_INT8: + fprintf(stderr, "%d\n", cd->value.i8); + break; + case TD_INT16: + fprintf(stderr, "%d\n", cd->value.i16); + break; + case TD_INT32: + fprintf(stderr, "%d\n", cd->value.i32); + break; + case TD_INT64: + fprintf(stderr, "%d\n", cd->value.i64); + break; + case TD_UINT8: + fprintf(stderr, "%d\n", cd->value.ui8); + break; + case TD_UINT16: + fprintf(stderr, "%d\n", cd->value.ui16); + break; + case TD_UINT32: + fprintf(stderr, "%d\n", cd->value.ui32); + break; + case TD_UINT64: + fprintf(stderr, "%d\n", cd->value.ui64); + break; + case TD_FLOAT: + fprintf(stderr, "%f\n", cd->value.flt); + break; + case TD_DOUBLE: + fprintf(stderr, "%g\n", cd->value.dbl); + break; + case TD_BOOL: + if (cd->value.bul) + fprintf(stderr, "TRUE\n"); + else + fprintf(stderr, "FALSE\n"); + break; + case TD_CHAR: + fprintf(stderr, "%d\n", cd->value.ui64); + break; + case TD_WCHAR: + fprintf(stderr, "%d\n", cd->value.ui64); + break; + case TD_VOID: + fprintf(stderr, "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", + cd->value.iid->m0, (PRUint32) cd->value.iid->m1, + (PRUint32) cd->value.iid->m2, + (PRUint32) cd->value.iid->m3[0], + (PRUint32) cd->value.iid->m3[1], + (PRUint32) cd->value.iid->m3[2], + (PRUint32) cd->value.iid->m3[3], + (PRUint32) cd->value.iid->m3[4], + (PRUint32) cd->value.iid->m3[5], + (PRUint32) cd->value.iid->m3[6], + (PRUint32) cd->value.iid->m3[7]); + } else + return PR_FALSE; + break; + case TD_PBSTR: + if (XPT_TDP_IS_POINTER(cd->type.prefix.flags)) { + if (!XPT_DumpXPTString(cd->value.string)) + return PR_FALSE; + fprintf(stderr, "\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); + } else + return PR_FALSE; + break; + case TD_PWSTRING: + if (XPT_TDP_IS_POINTER(cd->type.prefix.flags)) { + fprintf(stderr, "%s\n", cd->value.wstr); + } else + return PR_FALSE; + break; + default: + perror("Unrecognized type"); + return PR_FALSE; + break; + } + + return PR_TRUE; +} + diff --git a/mozilla/xpcom/typelib/xpt/public/xpt_struct.h b/mozilla/xpcom/typelib/xpt/public/xpt_struct.h index 85ab90ee0fa..bd81ffbc46d 100644 --- a/mozilla/xpcom/typelib/xpt/public/xpt_struct.h +++ b/mozilla/xpcom/typelib/xpt/public/xpt_struct.h @@ -188,6 +188,10 @@ struct XPTTypeDescriptorPrefix { #define XPT_TDP_TAGMASK (~XPT_TDP_FLAGMASK) #define XPT_TDP_TAG(tdp) ((tdp).flags & XPT_TDP_TAGMASK) +#define XPT_TDP_IS_POINTER(flags) (flags & XPT_TDP_POINTER) +#define XPT_TDP_IS_UNIQUE_POINTER(flags) (flags & XPT_TDP_UNIQUE_POINTER) +#define XPT_TDP_IS_REFERENCE(flags) (flags & XPT_TDP_REFERENCE) + /* XXX TD #defines should include required flag bits! */ /* @@ -280,17 +284,23 @@ struct XPTTypeDescriptor { * String record containing the constant string. */ union XPTConstValue { - int8 i8; - uint8 ui8; - int16 i16; - uint16 ui16; - int32 i32; - uint32 ui32; - int64 i64; - uint64 ui64; - uint16 wch; - char ch; - XPTString *string; + int8 i8; + uint8 ui8; + int16 i16; + uint16 ui16; + int32 i32; + uint32 ui32; + int64 i64; + uint64 ui64; + float flt; + double dbl; + PRBool bul; + char ch; + uint16 wch; + nsID *iid; + XPTString *string; + char *str; + uint16 *wstr; }; /* varies according to type */ struct XPTConstDescriptor { @@ -314,6 +324,10 @@ struct XPTParamDescriptor { #define XPT_PD_RETVAL 0x20 #define XPT_PD_FLAGMASK 0x70 +#define XPT_PD_IS_IN(flags) (flags & XPT_PD_IN) +#define XPT_PD_IS_OUT(flags) (flags & XPT_PD_OUT) +#define XPT_PD_IS_RETVAL(flags) (flags & XPT_PD_RETVAL) + #define XPT_PARAMDESCRIPTOR_SIZE (XPT_TYPEDESCRIPTOR_SIZE + 1) PRBool @@ -340,6 +354,12 @@ struct XPTMethodDescriptor { #define XPT_MD_HIDDEN 0x08 #define XPT_MD_FLAGMASK 0xf8 +#define XPT_MD_IS_GETTER(flags) (flags & XPT_MD_GETTER) +#define XPT_MD_IS_SETTER(flags) (flags & XPT_MD_SETTER) +#define XPT_MD_IS_VARARGS(flags) (flags & XPT_MD_VARARGS) +#define XPT_MD_IS_CTOR(flags) (flags & XPT_MD_CTOR) +#define XPT_MD_IS_HIDDEN(flags) (flags & XPT_MD_HIDDEN) + PRBool XPT_FillMethodDescriptor(XPTMethodDescriptor *meth, uint8 flags, char *name, uint8 num_args); diff --git a/mozilla/xpcom/typelib/xpt/tests/SimpleTypeLib.c b/mozilla/xpcom/typelib/xpt/tests/SimpleTypeLib.c index 598385d9cea..f0fc94522ab 100644 --- a/mozilla/xpcom/typelib/xpt/tests/SimpleTypeLib.c +++ b/mozilla/xpcom/typelib/xpt/tests/SimpleTypeLib.c @@ -42,6 +42,12 @@ #define DOUBLE_INDENT " " #define TRIPLE_INDENT " " #define QUAD_INDENT " " +#define QUINT_INDENT " " +#define SEXT_INDENT " " +#define SEPT_INDENT " " +#define OCT_INDENT " " +#define NONA_INDENT " " +#define DECA_INDENT " " struct nsID iid = { 0x00112233, @@ -136,7 +142,7 @@ main(int argc, char **argv) ok = XPT_DoHeader(cursor, &header); TRY("DoHeader", ok); - out = fopen(argv[1], "w"); + /* out = fopen(argv[1], "w"); if (!out) { perror("FAILED: fopen"); return 1; @@ -149,7 +155,7 @@ main(int argc, char **argv) fwrite(data, len, 1, out); fclose(out); XPT_DestroyXDRState(state); - + */ fprintf(stderr, "\n'%s' Header:\n", argv[1]); XPT_DumpHeader(header); @@ -180,37 +186,34 @@ XPT_DumpHeader(XPTHeader *header) PRBool XPT_DumpAnnotations(XPTAnnotation *ann) { - int i = 0, j = 0; + int i = -1, j = 0; XPTAnnotation *last; fprintf(stderr, "\n%sAnnotations:\n", INDENT); do { i++; - fprintf(stderr, "%sAnnotation #%d:\n", DOUBLE_INDENT, i); if (XPT_ANN_IS_PRIVATE(ann->flags)) { fprintf(stderr, "%sAnnotation #%d is private.\n", - TRIPLE_INDENT, i); - fprintf(stderr, "%sCreator: ", QUAD_INDENT); - for (j=0; jcreator->length; j++) { - fprintf(stderr, "%c", ann->creator->bytes[j]); - } + DOUBLE_INDENT, i); + fprintf(stderr, "%sCreator: ", TRIPLE_INDENT); + if (!XPT_DumpXPTString(ann->creator)) + return PR_FALSE; fprintf(stderr, "\n"); - fprintf(stderr, "%sPrivate Data: ", QUAD_INDENT); - for (j=0; jprivate_data->length; j++) { - fprintf(stderr, "%c", ann->private_data->bytes[j]); - } + fprintf(stderr, "%sPrivate Data: ", TRIPLE_INDENT); + if (!XPT_DumpXPTString(ann->private_data)) + return PR_FALSE; fprintf(stderr, "\n"); } else { fprintf(stderr, "%sAnnotation #%d is empty.\n", - TRIPLE_INDENT, i); + DOUBLE_INDENT, i); } last = ann; ann = ann->next; } while (!XPT_ANN_IS_LAST(last->flags)); fprintf(stderr, "%sAnnotation #%d is the last annotation.\n", - TRIPLE_INDENT, i); + DOUBLE_INDENT, i); return PR_TRUE; } @@ -222,7 +225,7 @@ XPT_DumpIDEs(XPTInterfaceDirectoryEntry *ide, int num_interfaces) fprintf(stderr, "\n%sInterface Directory:\n", INDENT); for (i=0; iname); fprintf(stderr, "%sNamespace: %s\n", TRIPLE_INDENT, ide->namespace); - fprintf(stderr, "%sAddress of interface descriptor: %d\n", + fprintf(stderr, "%sAddress of interface descriptor: %p\n", TRIPLE_INDENT, ide->interface_descriptor); + if (!XPT_DumpInterfaceDescriptor(ide->interface_descriptor)) + return PR_FALSE; } return PR_TRUE; } + +PRBool +XPT_DumpInterfaceDescriptor(XPTInterfaceDescriptor *id) +{ + int i; + + fprintf(stderr, "%sDescriptor:\n", TRIPLE_INDENT); + fprintf(stderr, "%sOffset of parent interface (in data pool): %d\n", + QUAD_INDENT, id->parent_interface); + fprintf(stderr, "%s# of Method Descriptors: %d\n", + QUAD_INDENT, id->num_methods); + for (i=0; inum_methods; i++) { + fprintf(stderr, "%sMethod #%d:\n", QUINT_INDENT, i); + if (!XPT_DumpMethodDescriptor(&id->method_descriptors[i])) + return PR_FALSE; + } + fprintf(stderr, "%s# of Constant Descriptors: %d\n", + QUAD_INDENT, id->num_constants); + for (i=0; inum_constants; i++) { + fprintf(stderr, "%sConstant #%d:\n", QUINT_INDENT, i); + if (!XPT_DumpConstDescriptor(&id->const_descriptors[i])) + return PR_FALSE; + } + + return PR_TRUE; +} + +PRBool +XPT_DumpMethodDescriptor(XPTMethodDescriptor *md) +{ + int i; + + fprintf(stderr, "%sName: %s\n", SEXT_INDENT, md->name); + fprintf(stderr, "%sIs Getter? ", SEXT_INDENT); + if (XPT_MD_IS_GETTER(md->flags)) + fprintf(stderr, "TRUE\n"); + else + fprintf(stderr, "FALSE\n"); + + fprintf(stderr, "%sIs Setter? ", SEXT_INDENT); + if (XPT_MD_IS_SETTER(md->flags)) + fprintf(stderr, "TRUE\n"); + else + fprintf(stderr, "FALSE\n"); + + fprintf(stderr, "%sIs Varargs? ", SEXT_INDENT); + if (XPT_MD_IS_VARARGS(md->flags)) + fprintf(stderr, "TRUE\n"); + else + fprintf(stderr, "FALSE\n"); + + fprintf(stderr, "%sIs Constructor? ", SEXT_INDENT); + if (XPT_MD_IS_CTOR(md->flags)) + fprintf(stderr, "TRUE\n"); + else + fprintf(stderr, "FALSE\n"); + + fprintf(stderr, "%sIs Hidden? ", SEXT_INDENT); + if (XPT_MD_IS_HIDDEN(md->flags)) + fprintf(stderr, "TRUE\n"); + else + fprintf(stderr, "FALSE\n"); + + fprintf(stderr, "%s# of arguments: %d\n", SEXT_INDENT, md->num_args); + fprintf(stderr, "%sParameter Descriptors:\n", SEXT_INDENT); + + for (i=0; inum_args; i++) { + fprintf(stderr, "%sParameter #%d:\n", SEPT_INDENT, i); + + if (!XPT_DumpParamDescriptor(&md->params[i])) + return PR_FALSE; + } + + fprintf(stderr, "%sResult:\n", SEXT_INDENT); + if (!XPT_DumpParamDescriptor(md->result)) + return PR_FALSE; + + return PR_TRUE; +} + +PRBool +XPT_DumpXPTString(XPTString *str) +{ + int i; + for (i=0; ilength; i++) { + fprintf(stderr, "%c", str->bytes[i]); + } + return PR_TRUE; +} + +PRBool +XPT_DumpParamDescriptor(XPTParamDescriptor *pd) +{ + fprintf(stderr, "%sIn Param? ", OCT_INDENT); + if (XPT_PD_IS_IN(pd->flags)) + fprintf(stderr, "TRUE\n"); + else + fprintf(stderr, "FALSE\n"); + + fprintf(stderr, "%sOut Param? ", OCT_INDENT); + if (XPT_PD_IS_OUT(pd->flags)) + fprintf(stderr, "TRUE\n"); + else + fprintf(stderr, "FALSE\n"); + + fprintf(stderr, "%sRetval? ", OCT_INDENT); + if (XPT_PD_IS_RETVAL(pd->flags)) + fprintf(stderr, "TRUE\n"); + else + fprintf(stderr, "FALSE\n"); + + fprintf(stderr, "%sType Descriptor:\n", OCT_INDENT); + if (!XPT_DumpTypeDescriptor(&pd->type)) + return PR_FALSE; + + return PR_TRUE; +} + +PRBool +XPT_DumpTypeDescriptor(XPTTypeDescriptor *td) +{ + fprintf(stderr, "%sIs Pointer? ", NONA_INDENT); + if (XPT_TDP_IS_POINTER(td->prefix.flags)) + fprintf(stderr, "TRUE\n"); + else + fprintf(stderr, "FALSE\n"); + + fprintf(stderr, "%sIs Unique Pointer? ", NONA_INDENT); + if (XPT_TDP_IS_UNIQUE_POINTER(td->prefix.flags)) + fprintf(stderr, "TRUE\n"); + else + fprintf(stderr, "FALSE\n"); + + fprintf(stderr, "%sIs Reference? ", NONA_INDENT); + if (XPT_TDP_IS_REFERENCE(td->prefix.flags)) + fprintf(stderr, "TRUE\n"); + else + fprintf(stderr, "FALSE\n"); + + fprintf(stderr, "%sTag: %d\n", NONA_INDENT, + XPT_TDP_TAG(td->prefix)); + + if (XPT_TDP_TAG(td->prefix) == TD_INTERFACE_TYPE) { + fprintf(stderr, "%sInterfaceTypeDescriptor:\n", NONA_INDENT); + fprintf(stderr, "%sIndex of IDE: %d\n", DECA_INDENT, + td->type.interface); + } + + if (XPT_TDP_TAG(td->prefix) == TD_INTERFACE_IS_TYPE) { + fprintf(stderr, "%sInterfaceTypeDescriptor:\n", NONA_INDENT); + fprintf(stderr, "%sIndex of Method Argument: %d\n", DECA_INDENT, + td->type.argnum); + } + + return PR_TRUE; +} + +PRBool +XPT_DumpConstDescriptor(XPTConstDescriptor *cd) +{ + fprintf(stderr, "%sName: %s\n", SEXT_INDENT, cd->name); + fprintf(stderr, "%sType Descriptor: \n", SEXT_INDENT); + if (!XPT_DumpTypeDescriptor(&cd->type)) + return PR_FALSE; + fprintf(stderr, "%sValue: ", SEXT_INDENT); + + switch(XPT_TDP_TAG(cd->type.prefix)) { + case TD_INT8: + fprintf(stderr, "%d\n", cd->value.i8); + break; + case TD_INT16: + fprintf(stderr, "%d\n", cd->value.i16); + break; + case TD_INT32: + fprintf(stderr, "%d\n", cd->value.i32); + break; + case TD_INT64: + fprintf(stderr, "%d\n", cd->value.i64); + break; + case TD_UINT8: + fprintf(stderr, "%d\n", cd->value.ui8); + break; + case TD_UINT16: + fprintf(stderr, "%d\n", cd->value.ui16); + break; + case TD_UINT32: + fprintf(stderr, "%d\n", cd->value.ui32); + break; + case TD_UINT64: + fprintf(stderr, "%d\n", cd->value.ui64); + break; + case TD_FLOAT: + fprintf(stderr, "%f\n", cd->value.flt); + break; + case TD_DOUBLE: + fprintf(stderr, "%g\n", cd->value.dbl); + break; + case TD_BOOL: + if (cd->value.bul) + fprintf(stderr, "TRUE\n"); + else + fprintf(stderr, "FALSE\n"); + break; + case TD_CHAR: + fprintf(stderr, "%d\n", cd->value.ui64); + break; + case TD_WCHAR: + fprintf(stderr, "%d\n", cd->value.ui64); + break; + case TD_VOID: + fprintf(stderr, "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", + cd->value.iid->m0, (PRUint32) cd->value.iid->m1, + (PRUint32) cd->value.iid->m2, + (PRUint32) cd->value.iid->m3[0], + (PRUint32) cd->value.iid->m3[1], + (PRUint32) cd->value.iid->m3[2], + (PRUint32) cd->value.iid->m3[3], + (PRUint32) cd->value.iid->m3[4], + (PRUint32) cd->value.iid->m3[5], + (PRUint32) cd->value.iid->m3[6], + (PRUint32) cd->value.iid->m3[7]); + } else + return PR_FALSE; + break; + case TD_PBSTR: + if (XPT_TDP_IS_POINTER(cd->type.prefix.flags)) { + if (!XPT_DumpXPTString(cd->value.string)) + return PR_FALSE; + fprintf(stderr, "\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); + } else + return PR_FALSE; + break; + case TD_PWSTRING: + if (XPT_TDP_IS_POINTER(cd->type.prefix.flags)) { + fprintf(stderr, "%s\n", cd->value.wstr); + } else + return PR_FALSE; + break; + default: + perror("Unrecognized type"); + return PR_FALSE; + break; + } + + return PR_TRUE; +} +