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:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user