27#include "wine/winternl.h"
36#define MAKEFOUR(a,b,c,d) ((DWORD)a + ((DWORD)b << 8) + ((DWORD)c << 16) + ((DWORD)d << 24))
37#define XOFFILE_FORMAT_MAGIC MAKEFOUR('x','o','f',' ')
38#define XOFFILE_FORMAT_VERSION_302 MAKEFOUR('0','3','0','2')
39#define XOFFILE_FORMAT_VERSION_303 MAKEFOUR('0','3','0','3')
40#define XOFFILE_FORMAT_BINARY MAKEFOUR('b','i','n',' ')
41#define XOFFILE_FORMAT_TEXT MAKEFOUR('t','x','t',' ')
42#define XOFFILE_FORMAT_BINARY_MSZIP MAKEFOUR('b','z','i','p')
43#define XOFFILE_FORMAT_TEXT_MSZIP MAKEFOUR('t','z','i','p')
44#define XOFFILE_FORMAT_COMPRESSED MAKEFOUR('c','m','p',' ')
45#define XOFFILE_FORMAT_FLOAT_BITS_32 MAKEFOUR('0','0','3','2')
46#define XOFFILE_FORMAT_FLOAT_BITS_64 MAKEFOUR('0','0','6','4')
48#define TOKEN_ERROR 0xffff
52#define TOKEN_INTEGER 3
54#define TOKEN_INTEGER_LIST 6
55#define TOKEN_FLOAT_LIST 7
56#define TOKEN_OBRACE 10
57#define TOKEN_CBRACE 11
58#define TOKEN_OPAREN 12
59#define TOKEN_CPAREN 13
60#define TOKEN_OBRACKET 14
61#define TOKEN_CBRACKET 15
62#define TOKEN_OANGLE 16
63#define TOKEN_CANGLE 17
66#define TOKEN_SEMICOLON 20
67#define TOKEN_TEMPLATE 31
71#define TOKEN_DOUBLE 43
75#define TOKEN_SDWORD 47
78#define TOKEN_UNICODE 50
79#define TOKEN_CSTRING 51
82#define CLSIDFMT "<%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X>"
87 if (!fourcc)
return "'null'";
89 (
char)(fourcc), (
char)(fourcc >> 8),
90 (
char)(fourcc >> 16), (
char)(fourcc >> 24));
201 TRACE(
"header = '%s'\n",
string);
232 DWORD decomp_file_size;
233 WORD decomp_chunk_size;
234 WORD comp_chunk_size;
237 if (!
read_bytes(
buf, &decomp_file_size,
sizeof(decomp_file_size)))
240 TRACE(
"Compressed format %s detected: decompressed file size with xof header = %d\n",
244 decomp_file_size -= 16;
249 ERR(
"Out of memory\n");
252 *decomp_buffer_ptr = decomp_buffer;
254 while (
buf->rem_bytes)
256 if (!
read_bytes(
buf, &decomp_chunk_size,
sizeof(decomp_chunk_size)))
258 if (!
read_bytes(
buf, &comp_chunk_size,
sizeof(comp_chunk_size)))
261 TRACE(
"Process chunk: compressed_size = %d, decompressed_size = %d\n",
262 comp_chunk_size, decomp_chunk_size);
267 WARN(
"Error while decompressing MSZIP chunk %d\n",
err);
271 buf->rem_bytes -= comp_chunk_size;
272 buf->buffer += comp_chunk_size;
273 decomp_buffer += decomp_chunk_size;
276 if ((decomp_buffer - *decomp_buffer_ptr) != decomp_file_size)
277 ERR(
"Size of all decompressed chunks (%u) does not match decompressed file size (%u)\n",
278 (
DWORD)(decomp_buffer - *decomp_buffer_ptr), decomp_file_size);
281 buf->buffer = *decomp_buffer_ptr;
282 buf->rem_bytes = decomp_file_size;
285 TRACE(
"Header is correct\n");
292#define DUMP_TOKEN(t) case t: TRACE(#t "\n"); break
466 if (
buf->rem_bytes < 38 || *
buf->buffer !=
'<')
469 while (
pos <
sizeof(tmp) - 2 && *(
buf->buffer+
pos) !=
'>')
478 TRACE(
"Wrong guid %s (%d)\n", tmp,
pos);
484 ret =
sscanf(tmp,
CLSIDFMT, &class_id.Data1, tab, tab+1, tab+2, tab+3, tab+4, tab+5, tab+6, tab+7, tab+8, tab+9);
487 TRACE(
"Wrong guid %s (%d)\n", tmp,
pos);
490 TRACE(
"Found guid %s (%d)\n", tmp,
pos);
492 class_id.Data2 = tab[0];
493 class_id.Data3 = tab[1];
494 class_id.Data4[0] = tab[2];
495 class_id.Data4[1] = tab[3];
496 class_id.Data4[2] = tab[4];
497 class_id.Data4[3] = tab[5];
498 class_id.Data4[4] = tab[6];
499 class_id.Data4[5] = tab[7];
500 class_id.Data4[6] = tab[8];
501 class_id.Data4[7] = tab[9];
516 if (!(((
c >=
'a') && (
c <=
'z')) || ((
c >=
'A') && (
c <=
'Z')) || ((
c >=
'0') && (
c <=
'9')) || (
c ==
'_') || (
c ==
'-')))
518 if (
pos <
sizeof(tmp))
522 tmp[
min(
pos,
sizeof(tmp) - 1)] = 0;
526 TRACE(
"Wrong name %s\n", tmp);
533 TRACE(
"Found name %s\n", tmp);
549 if (!((!
pos && (
c ==
'-')) || ((
c >=
'0') && (
c <=
'9')) || (!dot && (
c ==
'.'))))
553 if (
pos <
sizeof(tmp))
557 tmp[
min(
pos,
sizeof(tmp) - 1)] = 0;
562 sscanf(tmp,
"%f", &decimal);
564 TRACE(
"Found float %s - %f\n", tmp, decimal);
566 *(
float*)
buf->value = decimal;
580 if (!((
c >=
'0') && (
c <=
'9')))
582 if (
pos <
sizeof(tmp))
586 tmp[
min(
pos,
sizeof(tmp) - 1)] = 0;
591 sscanf(tmp,
"%d", &integer);
593 TRACE(
"Found integer %s - %d\n", tmp, integer);
607 if (*
buf->buffer !=
'"')
610 while ((
pos+1) <
buf->rem_bytes)
618 if (
pos <
sizeof(tmp))
622 tmp[
min(
pos,
sizeof(tmp) - 1)] = 0;
626 TRACE(
"Wrong string %s\n", tmp);
631 buf->rem_bytes -=
pos + 2;
633 TRACE(
"Found string %s\n", tmp);
650 if ((
c ==
'#') || (
c ==
'/'))
713 FIXME(
"Unrecognize element\n");
720 if (!
buf->list_nb_elements)
732 TRACE(
"Integer list (TOKEN_INTEGER_LIST) of size %d\n",
buf->list_nb_elements);
740 TRACE(
"Float list (TOKEN_FLOAT_LIST) of size %d\n",
buf->list_nb_elements);
744 if (
buf->list_nb_elements)
746 if (
buf->list_separator)
748 buf->list_nb_elements--;
775 char *
name = (
char*)
buf->value;
791 TRACE(
"integer = %u\n", integer);
803 sprintf(strguid,
CLSIDFMT, class_id.Data1, class_id.Data2, class_id.Data3, class_id.Data4[0],
804 class_id.Data4[1], class_id.Data4[2], class_id.Data4[3], class_id.Data4[4], class_id.Data4[5],
805 class_id.Data4[6], class_id.Data4[7]);
806 TRACE(
"guid = %s\n", strguid);
814 char *
string = (
char*)
buf->value;
821 TRACE(
"string = %s\n",
string);
864 if (
buf->token_present)
867 return buf->current_token;
872 return buf->current_token;
877 if (
buf->token_present)
878 return buf->current_token;
883 return buf->current_token;
913 xtemplate* cur_template = &
buf->pdxf->xtemplates[
buf->pdxf->nb_xtemplates];
953 cur_member = &
buf->pdxf->xtemplates[
buf->pdxf->nb_xtemplates].members[idx_member];
964 if (!
strcmp((
char*)
buf->value,
"indexColor"))
980 WARN(
"Reference to a nonexistent template '%s'\n", (
char*)
buf->value);
1000 FIXME(
"Too many dimensions (%d) for multi-dimensional array\n", nb_dims + 1);
1015 for (
i = 0;
i < idx_member;
i++)
1017 if (!
strcmp((
char*)
buf->value,
buf->pdxf->xtemplates[
buf->pdxf->nb_xtemplates].members[
i].name))
1019 if (
buf->pdxf->xtemplates[
buf->pdxf->nb_xtemplates].members[
i].nb_dims)
1021 ERR(
"Array cannot be used to specify variable array size\n");
1026 FIXME(
"Only DWORD supported to specify variable array size\n");
1032 if (
i == idx_member)
1034 ERR(
"Reference to unknown member %s\n", (
char*)
buf->value);
1046 cur_member->
nb_dims = nb_dims;
1054 buf->pdxf->xtemplates[
buf->pdxf->nb_xtemplates].nb_members = idx_member;
1081 strcpy(
buf->pdxf->xtemplates[
buf->pdxf->nb_xtemplates].name, (
char*)
buf->value);
1092 TRACE(
"%d - %s - %s\n",
buf->pdxf->nb_xtemplates,
buf->pdxf->xtemplates[
buf->pdxf->nb_xtemplates].name,
debugstr_guid(&
buf->pdxf->xtemplates[
buf->pdxf->nb_xtemplates].class_id));
1093 buf->pdxf->nb_xtemplates++;
1106 WARN(
"Template is not correct\n");
1111 TRACE(
"Template successfully parsed:\n");
1121 if ((
buf->cur_pos_data +
size) >
buf->capacity)
1124 ULONG new_capacity =
buf->capacity ? 2 *
buf->capacity : 100000;
1131 buf->capacity = new_capacity;
1145 buf->pxo->nb_members =
pt->nb_members;
1147 for (
i = 0;
i <
pt->nb_members;
i++)
1154 buf->pxo->members[
i].start =
buf->cur_pos_data;
1156 for (
k = 0;
k <
pt->members[
i].nb_dims;
k++)
1158 if (
pt->members[
i].dim_fixed[
k])
1159 nb_elems *=
pt->members[
i].dim_value[
k];
1161 nb_elems *= *(
DWORD*)(
buf->pxo->root->pdata +
buf->pxo->members[
pt->members[
i].dim_value[
k]].start);
1164 TRACE(
"Elements to consider: %u\n", nb_elems);
1166 for (
k = 0;
k < nb_elems;
k++)
1172 TRACE(
"Found sub-object %s\n",
buf->pdxf->xtemplates[
pt->members[
i].idx_template].name);
1176 for (
j = 0;
j <
buf->pdxf->nb_xtemplates;
j++)
1178 if (!
_strnicmp(
buf->pdxf->xtemplates[
pt->members[
i].idx_template].name,
buf->pdxf->xtemplates[
j].name, -1))
1180 buf->pxt[
buf->level] = &
buf->pdxf->xtemplates[
j];
1184 if (
j ==
buf->pdxf->nb_xtemplates)
1186 ERR(
"Unknown template %s\n", (
char*)
buf->value);
1190 TRACE(
"Enter %s\n",
buf->pdxf->xtemplates[
pt->members[
i].idx_template].name);
1211 buf->cur_pos_data += 2;
1216 buf->cur_pos_data += 4;
1220 FIXME(
"Token %d not supported\n",
pt->members[
i].type);
1232 *(
float *)(
buf->pdata +
buf->cur_pos_data) = *(
float *)
buf->
value;
1233 buf->cur_pos_data += 4;
1237 FIXME(
"Token %d not supported\n",
pt->members[
i].type);
1252 FIXME(
"Buffer too small %p %p %d\n",
buf->cur_pstrings,
buf->pstrings,
len);
1256 *(((
LPCSTR*)(
buf->pdata +
buf->cur_pos_data))) = (
char*)
buf->cur_pstrings;
1257 buf->cur_pstrings +=
len;
1258 buf->cur_pos_data +=
sizeof(
LPSTR);
1262 FIXME(
"Token %d not supported\n",
pt->members[
i].type);
1287 buf->pxo->members[
i].size =
buf->cur_pos_data -
buf->pxo->members[
i].start;
1295 buf->pxo->nb_children = 0;
1302 buf->pxo->size =
buf->cur_pos_data -
buf->pxo->pos_data;
1314 TRACE(
"Found optional reference %s\n", (
char*)
buf->value);
1315 for (
i = 0;
i < (
buf->nb_pxo_globals+1);
i++)
1317 for (
j = 0;
j < (
buf->pxo_globals[
i])[0].nb_subobjects;
j++)
1324 if (
i == (
buf->nb_pxo_globals+1))
1326 ERR(
"Reference to unknown object %s\n", (
char*)
buf->value);
1332 FIXME(
"Too many sub-objects\n");
1336 buf->pxo->children[
buf->pxo->nb_children] = &
buf->pxo_tab[
buf->pxo->root->nb_subobjects++];
1337 buf->pxo->children[
buf->pxo->nb_children]->ptarget = &(
buf->pxo_globals[
i])[
j];
1338 buf->pxo->children[
buf->pxo->nb_children]->binary =
FALSE;
1339 buf->pxo->nb_children++;
1347 FIXME(
"Too many sub-objects\n");
1351 buf->pxo =
buf->pxo->children[
buf->pxo->nb_children] = &
buf->pxo_tab[
buf->pxo->root->nb_subobjects];
1352 pxo->root->nb_subobjects++;
1354 TRACE(
"Enter optional %s\n", (
char*)
buf->value);
1363 buf->pxo->nb_children++;
1372 FIXME(
"Too many children %d\n",
buf->pxo->nb_children);
1383 buf->pxo->pos_data =
buf->cur_pos_data;
1386 buf->pxo->root =
buf->pxo_tab;
1392 for (
i = 0;
i <
buf->pdxf->nb_xtemplates;
i++)
1396 buf->pxt[
buf->level] = &
buf->pdxf->xtemplates[
i];
1397 memcpy(&
buf->pxo->type, &
buf->pdxf->xtemplates[
i].class_id, 16);
1401 if (
i ==
buf->pdxf->nb_xtemplates)
1403 ERR(
"Unknown template %s\n", (
char*)
buf->value);
1413 buf->pxo->name[0] = 0;
int strcmp(const char *String1, const char *String2)
ACPI_SIZE strlen(const char *String)
char * strcpy(char *DstString, const char *SrcString)
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
int mszip_decompress(int inlen, int outlen, char *inbuffer, char *outbuffer) DECLSPEC_HIDDEN
#define MAX_STRINGS_BUFFER
const char * wine_dbg_sprintf(const char *format,...)
#define _strnicmp(_String1, _String2, _MaxCount)
#define HeapFree(x, y, z)
#define DXFILEERR_BADALLOC
#define DXFILEERR_BADFILEVERSION
#define DXFILEERR_BADFILEFLOATSIZE
#define DXFILEERR_BADFILETYPE
GLuint GLuint GLsizei count
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLenum GLuint GLenum GLsizei const GLchar * buf
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat token
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
_Check_return_ _CRTIMP int __cdecl sscanf(_In_z_ const char *_Src, _In_z_ _Scanf_format_string_ const char *_Format,...)
#define memcpy(s1, s2, n)
#define sprintf(buf, format,...)
static PROTOCOLDATA * pdata
static BOOL parse_template_members_list(parse_buffer *buf)
#define XOFFILE_FORMAT_MAGIC
#define XOFFILE_FORMAT_FLOAT_BITS_32
static WORD get_operator_token(char c)
static WORD parse_TOKEN(parse_buffer *buf)
#define XOFFILE_FORMAT_VERSION_302
BOOL parse_object(parse_buffer *buf)
static void dump_TOKEN(WORD token)
static BOOL is_float(parse_buffer *buf)
static void dump_template(xtemplate *templates_array, xtemplate *ptemplate)
static BOOL read_bytes(parse_buffer *buf, LPVOID data, DWORD size)
static const char * debugstr_fourcc(DWORD fourcc)
static BOOL parse_object_parts(parse_buffer *buf, BOOL allow_optional)
static BOOL parse_template_option_info(parse_buffer *buf)
static void rewind_bytes(parse_buffer *buf, DWORD size)
static const char * get_primitive_string(DWORD token)
static BOOL is_operator(char c)
static BOOL is_name(parse_buffer *buf)
static BOOL parse_object_members_list(parse_buffer *buf)
static WORD check_TOKEN(parse_buffer *buf)
#define XOFFILE_FORMAT_BINARY
static BOOL is_keyword(parse_buffer *buf, const char *keyword)
static BOOL parse_template(parse_buffer *buf)
static BOOL is_primitive_type(WORD token)
static BOOL is_integer(parse_buffer *buf)
#define XOFFILE_FORMAT_TEXT
static WORD get_keyword_token(parse_buffer *buf)
static BOOL check_buffer(parse_buffer *buf, ULONG size)
static WORD get_TOKEN(parse_buffer *buf)
static BOOL parse_template_parts(parse_buffer *buf)
#define XOFFILE_FORMAT_VERSION_303
#define TOKEN_INTEGER_LIST
#define XOFFILE_FORMAT_BINARY_MSZIP
static BOOL is_guid(parse_buffer *buf)
#define XOFFILE_FORMAT_TEXT_MSZIP
HRESULT parse_header(parse_buffer *buf, BYTE **decomp_buffer_ptr)
static BOOL is_separator(char c)
BOOL parse_templates(parse_buffer *buf, BOOL templates_only)
static BOOL is_string(parse_buffer *buf)
#define XOFFILE_FORMAT_FLOAT_BITS_64
const char int wine_dbg_printf(const char *format,...) __WINE_PRINTF_ATTR(1
BOOL dim_fixed[MAX_ARRAY_DIM]
ULONG dim_value[MAX_ARRAY_DIM]
member members[MAX_MEMBERS]
char children[MAX_CHILDREN][MAX_NAME_LEN]
_In_ XLATEOBJ _In_ XFORMOBJ * pxo