NOT YET PART OF SEAMONKEY:

* added macros for checking bitflag values
* dump code is complete, minus actually reading from disk.


git-svn-id: svn://10.0.0.236/trunk@18912 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
coop%netscape.com
1999-01-28 06:01:56 +00:00
parent 1d91508c07
commit 49a193f463
4 changed files with 620 additions and 56 deletions

View File

@@ -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);

View File

@@ -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; j<ann->creator->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; j<ann->private_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; i<num_interfaces; i++) {
fprintf(stderr, "%sInterface #%d:\n", DOUBLE_INDENT, i+1);
fprintf(stderr, "%sInterface #%d:\n", DOUBLE_INDENT, i);
fprintf(stderr, "%sIID: "
"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
TRIPLE_INDENT,
@@ -236,8 +239,267 @@ XPT_DumpIDEs(XPTInterfaceDirectoryEntry *ide, int num_interfaces)
TRIPLE_INDENT, ide->name);
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; i<id->num_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; i<id->num_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; i<md->num_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; i<str->length; 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;
}

View File

@@ -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);

View File

@@ -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; j<ann->creator->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; j<ann->private_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; i<num_interfaces; i++) {
fprintf(stderr, "%sInterface #%d:\n", DOUBLE_INDENT, i+1);
fprintf(stderr, "%sInterface #%d:\n", DOUBLE_INDENT, i);
fprintf(stderr, "%sIID: "
"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
TRIPLE_INDENT,
@@ -236,8 +239,267 @@ XPT_DumpIDEs(XPTInterfaceDirectoryEntry *ide, int num_interfaces)
TRIPLE_INDENT, ide->name);
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; i<id->num_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; i<id->num_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; i<md->num_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; i<str->length; 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;
}