out = fopen(argv[1], "w");
out = fopen(argv[1], "wb");
main(int argc, char **argv){    XPTHeader *header;    XPTAnnotation *ann;    XPTInterfaceDescriptor *id;    XPTMethodDescriptor *meth;    XPTState *state;    XPTCursor curs, *cursor = &curs;    char *data, *head;    FILE *out;    uint32 len, header_sz;    PRBool ok;    td_void.prefix.flags = TD_VOID;        if (argc != 2) {	fprintf(stderr, "Usage: %s <filename.xpt>\n"		"       Creates a simple typelib file.\n", argv[0]);		return 1;    }    /* construct a header */    header = XPT_NewHeader(1);    TRY("NewHeader", header);        ann = XPT_NewAnnotation(XPT_ANN_LAST | XPT_ANN_PRIVATE,                            XPT_NewStringZ("SimpleTypeLib 1.0"),                            XPT_NewStringZ("See You In Rome"));    TRY("NewAnnotation", ann);    header->annotations = ann;    header_sz = XPT_SizeOfHeaderBlock(header);    id = XPT_NewInterfaceDescriptor(0xdead, 2, 2);    TRY("NewInterfaceDescriptor", id);        ok = XPT_FillInterfaceDirectoryEntry(header->interface_directory, &iid,					 "Interface", "NS", id);    TRY("FillInterfaceDirectoryEntry", ok);    /* void method1(void) */    meth = &id->method_descriptors[0];    ok = XPT_FillMethodDescriptor(meth, 0, "method1", 0);    TRY("FillMethodDescriptor", ok);    meth->result->flags = 0;    meth->result->type.prefix.flags = TD_VOID;    /* wstring method2(in uint32, in bool) */    meth = &id->method_descriptors[1];    ok = XPT_FillMethodDescriptor(meth, 0, "method2", 2);    TRY("FillMethodDescriptor", ok);    meth->result->flags = 0;    meth->result->type.prefix.flags = TD_PBSTR | XPT_TDP_POINTER;    meth->params[0].type.prefix.flags = TD_UINT32;    meth->params[0].flags = XPT_PD_IN;    meth->params[1].type.prefix.flags = TD_BOOL;    meth->params[1].flags = XPT_PD_IN;    /* const one = 1; */    id->const_descriptors[0].name = "one";    id->const_descriptors[0].type.prefix.flags = TD_UINT16;    id->const_descriptors[0].value.ui16 = 1;        /* const squeamish = "ossifrage"; */    id->const_descriptors[1].name = "squeamish";    id->const_descriptors[1].type.prefix.flags = TD_PBSTR | XPT_TDP_POINTER;    id->const_descriptors[1].value.string = XPT_NewStringZ("ossifrage");    /* serialize it */    state = XPT_NewXDRState(XPT_ENCODE, NULL, 0);    TRY("NewState (ENCODE)", state);        ok = XPT_MakeCursor(state, XPT_HEADER, header_sz, cursor);    TRY("MakeCursor", ok);    ok = XPT_DoHeader(cursor, &header);    TRY("DoHeader", ok);    out = fopen(argv[1], "w");    if (!out) {        perror("FAILED: fopen");        return 1;    }        XPT_GetXDRData(state, XPT_HEADER, &head, &len);    fwrite(head, len, 1, out);    XPT_GetXDRData(state, XPT_DATA, &data, &len);    fwrite(data, len, 1, out);    if (ferror(out) != 0 || fclose(out) != 0) {        fprintf(stderr, "\nError writing file: %s\n\n", argv[1]);    } else {        fprintf(stderr, "\nFile written: %s\n\n", argv[1]);    }    XPT_DestroyXDRState(state);        /* XXX DestroyHeader */    return 0;}