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>"
192 TRACE(
"header = '%s'\n",
string);
204 WARN(
"File type %s unknown\n", debugstr_fourcc(
header[2]));
223 DWORD decomp_file_size;
224 WORD decomp_chunk_size;
225 WORD comp_chunk_size;
228 if (!
read_bytes(
buf, &decomp_file_size,
sizeof(decomp_file_size)))
231 TRACE(
"Compressed format %s detected: decompressed file size with xof header = %d\n",
232 debugstr_fourcc(
header[2]), decomp_file_size);
235 decomp_file_size -= 16;
240 ERR(
"Out of memory\n");
243 *decomp_buffer_ptr = decomp_buffer;
245 while (
buf->rem_bytes)
247 if (!
read_bytes(
buf, &decomp_chunk_size,
sizeof(decomp_chunk_size)))
249 if (!
read_bytes(
buf, &comp_chunk_size,
sizeof(comp_chunk_size)))
252 TRACE(
"Process chunk: compressed_size = %d, decompressed_size = %d\n",
253 comp_chunk_size, decomp_chunk_size);
258 WARN(
"Error while decompressing MSZIP chunk %d\n",
err);
262 buf->rem_bytes -= comp_chunk_size;
263 buf->buffer += comp_chunk_size;
264 decomp_buffer += decomp_chunk_size;
267 if ((decomp_buffer - *decomp_buffer_ptr) != decomp_file_size)
268 ERR(
"Size of all decompressed chunks (%u) does not match decompressed file size (%u)\n",
269 (
DWORD)(decomp_buffer - *decomp_buffer_ptr), decomp_file_size);
272 buf->buffer = *decomp_buffer_ptr;
273 buf->rem_bytes = decomp_file_size;
276 TRACE(
"Header is correct\n");
283#define DUMP_TOKEN(t) case t: TRACE(#t "\n"); break
457 if (
buf->rem_bytes < 38 || *
buf->buffer !=
'<')
460 while (
pos <
sizeof(tmp) - 2 && *(
buf->buffer+
pos) !=
'>')
469 TRACE(
"Wrong guid %s (%d)\n", tmp,
pos);
475 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);
478 TRACE(
"Wrong guid %s (%d)\n", tmp,
pos);
481 TRACE(
"Found guid %s (%d)\n", tmp,
pos);
483 class_id.Data2 =
tab[0];
484 class_id.Data3 =
tab[1];
485 class_id.Data4[0] =
tab[2];
486 class_id.Data4[1] =
tab[3];
487 class_id.Data4[2] =
tab[4];
488 class_id.Data4[3] =
tab[5];
489 class_id.Data4[4] =
tab[6];
490 class_id.Data4[5] =
tab[7];
491 class_id.Data4[6] =
tab[8];
492 class_id.Data4[7] =
tab[9];
507 if (!(((
c >=
'a') && (
c <=
'z')) || ((
c >=
'A') && (
c <=
'Z')) || ((
c >=
'0') && (
c <=
'9')) || (
c ==
'_') || (
c ==
'-')))
509 if (
pos <
sizeof(tmp))
513 tmp[
min(
pos,
sizeof(tmp) - 1)] = 0;
517 TRACE(
"Wrong name %s\n", tmp);
524 TRACE(
"Found name %s\n", tmp);
540 if (!((!
pos && (
c ==
'-')) || ((
c >=
'0') && (
c <=
'9')) || (!dot && (
c ==
'.'))))
544 if (
pos <
sizeof(tmp))
548 tmp[
min(
pos,
sizeof(tmp) - 1)] = 0;
553 sscanf(tmp,
"%f", &decimal);
555 TRACE(
"Found float %s - %f\n", tmp, decimal);
557 *(
float*)
buf->value = decimal;
571 if (!((
c >=
'0') && (
c <=
'9')))
573 if (
pos <
sizeof(tmp))
577 tmp[
min(
pos,
sizeof(tmp) - 1)] = 0;
598 if (*
buf->buffer !=
'"')
601 while ((
pos+1) <
buf->rem_bytes)
609 if (
pos <
sizeof(tmp))
613 tmp[
min(
pos,
sizeof(tmp) - 1)] = 0;
617 TRACE(
"Wrong string %s\n", tmp);
622 buf->rem_bytes -=
pos + 2;
624 TRACE(
"Found string %s\n", tmp);
641 if ((
c ==
'#') || (
c ==
'/'))
704 FIXME(
"Unrecognize element\n");
711 if (!
buf->list_nb_elements)
723 TRACE(
"Integer list (TOKEN_INTEGER_LIST) of size %d\n",
buf->list_nb_elements);
731 TRACE(
"Float list (TOKEN_FLOAT_LIST) of size %d\n",
buf->list_nb_elements);
735 if (
buf->list_nb_elements)
737 if (
buf->list_separator)
739 buf->list_nb_elements--;
766 char *
name = (
char*)
buf->value;
794 sprintf(strguid,
CLSIDFMT, class_id.Data1, class_id.Data2, class_id.Data3, class_id.Data4[0],
795 class_id.Data4[1], class_id.Data4[2], class_id.Data4[3], class_id.Data4[4], class_id.Data4[5],
796 class_id.Data4[6], class_id.Data4[7]);
797 TRACE(
"guid = %s\n", strguid);
805 char *
string = (
char*)
buf->value;
812 TRACE(
"string = %s\n",
string);
855 if (
buf->token_present)
858 return buf->current_token;
863 return buf->current_token;
868 if (
buf->token_present)
869 return buf->current_token;
874 return buf->current_token;
904 xtemplate* cur_template = &
buf->pdxf->xtemplates[
buf->pdxf->nb_xtemplates];
944 cur_member = &
buf->pdxf->xtemplates[
buf->pdxf->nb_xtemplates].members[idx_member];
955 if (!
strcmp((
char*)
buf->value,
"indexColor"))
971 WARN(
"Reference to a nonexistent template '%s'\n", (
char*)
buf->value);
991 FIXME(
"Too many dimensions (%d) for multi-dimensional array\n", nb_dims + 1);
1006 for (
i = 0;
i < idx_member;
i++)
1008 if (!
strcmp((
char*)
buf->value,
buf->pdxf->xtemplates[
buf->pdxf->nb_xtemplates].members[
i].name))
1010 if (
buf->pdxf->xtemplates[
buf->pdxf->nb_xtemplates].members[
i].nb_dims)
1012 ERR(
"Array cannot be used to specify variable array size\n");
1017 FIXME(
"Only DWORD supported to specify variable array size\n");
1023 if (
i == idx_member)
1025 ERR(
"Reference to unknown member %s\n", (
char*)
buf->value);
1037 cur_member->
nb_dims = nb_dims;
1045 buf->pdxf->xtemplates[
buf->pdxf->nb_xtemplates].nb_members = idx_member;
1072 strcpy(
buf->pdxf->xtemplates[
buf->pdxf->nb_xtemplates].name, (
char*)
buf->value);
1083 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));
1084 buf->pdxf->nb_xtemplates++;
1097 WARN(
"Template is not correct\n");
1102 TRACE(
"Template successfully parsed:\n");
1112 if ((
buf->cur_pos_data +
size) >
buf->capacity)
1115 ULONG new_capacity =
buf->capacity ? 2 *
buf->capacity : 100000;
1122 buf->capacity = new_capacity;
1136 buf->pxo->nb_members =
pt->nb_members;
1138 for (
i = 0;
i <
pt->nb_members;
i++)
1145 buf->pxo->members[
i].start =
buf->cur_pos_data;
1147 for (
k = 0;
k <
pt->members[
i].nb_dims;
k++)
1149 if (
pt->members[
i].dim_fixed[
k])
1150 nb_elems *=
pt->members[
i].dim_value[
k];
1152 nb_elems *= *(
DWORD*)(
buf->pxo->root->pdata +
buf->pxo->members[
pt->members[
i].dim_value[
k]].start);
1155 TRACE(
"Elements to consider: %u\n", nb_elems);
1157 for (
k = 0;
k < nb_elems;
k++)
1163 TRACE(
"Found sub-object %s\n",
buf->pdxf->xtemplates[
pt->members[
i].idx_template].name);
1167 for (
j = 0;
j <
buf->pdxf->nb_xtemplates;
j++)
1169 if (!
_strnicmp(
buf->pdxf->xtemplates[
pt->members[
i].idx_template].name,
buf->pdxf->xtemplates[
j].name, -1))
1171 buf->pxt[
buf->level] = &
buf->pdxf->xtemplates[
j];
1175 if (
j ==
buf->pdxf->nb_xtemplates)
1177 ERR(
"Unknown template %s\n", (
char*)
buf->value);
1181 TRACE(
"Enter %s\n",
buf->pdxf->xtemplates[
pt->members[
i].idx_template].name);
1202 buf->cur_pos_data += 2;
1207 buf->cur_pos_data += 4;
1211 FIXME(
"Token %d not supported\n",
pt->members[
i].type);
1223 *(
float *)(
buf->pdata +
buf->cur_pos_data) = *(
float *)
buf->
value;
1224 buf->cur_pos_data += 4;
1228 FIXME(
"Token %d not supported\n",
pt->members[
i].type);
1243 FIXME(
"Buffer too small %p %p %d\n",
buf->cur_pstrings,
buf->pstrings,
len);
1247 *(((
LPCSTR*)(
buf->pdata +
buf->cur_pos_data))) = (
char*)
buf->cur_pstrings;
1248 buf->cur_pstrings +=
len;
1249 buf->cur_pos_data +=
sizeof(
LPSTR);
1253 FIXME(
"Token %d not supported\n",
pt->members[
i].type);
1278 buf->pxo->members[
i].size =
buf->cur_pos_data -
buf->pxo->members[
i].start;
1286 buf->pxo->nb_children = 0;
1293 buf->pxo->size =
buf->cur_pos_data -
buf->pxo->pos_data;
1305 TRACE(
"Found optional reference %s\n", (
char*)
buf->value);
1306 for (
i = 0;
i < (
buf->nb_pxo_globals+1);
i++)
1308 for (
j = 0;
j < (
buf->pxo_globals[
i])[0].nb_subobjects;
j++)
1315 if (
i == (
buf->nb_pxo_globals+1))
1317 ERR(
"Reference to unknown object %s\n", (
char*)
buf->value);
1323 FIXME(
"Too many sub-objects\n");
1327 buf->pxo->children[
buf->pxo->nb_children] = &
buf->pxo_tab[
buf->pxo->root->nb_subobjects++];
1328 buf->pxo->children[
buf->pxo->nb_children]->ptarget = &(
buf->pxo_globals[
i])[
j];
1329 buf->pxo->children[
buf->pxo->nb_children]->binary =
FALSE;
1330 buf->pxo->nb_children++;
1338 FIXME(
"Too many sub-objects\n");
1342 buf->pxo =
buf->pxo->children[
buf->pxo->nb_children] = &
buf->pxo_tab[
buf->pxo->root->nb_subobjects];
1343 pxo->root->nb_subobjects++;
1345 TRACE(
"Enter optional %s\n", (
char*)
buf->value);
1354 buf->pxo->nb_children++;
1363 FIXME(
"Too many children %d\n",
buf->pxo->nb_children);
1374 buf->pxo->pos_data =
buf->cur_pos_data;
1377 buf->pxo->root =
buf->pxo_tab;
1383 for (
i = 0;
i <
buf->pdxf->nb_xtemplates;
i++)
1387 buf->pxt[
buf->level] = &
buf->pdxf->xtemplates[
i];
1388 memcpy(&
buf->pxo->type, &
buf->pdxf->xtemplates[
i].class_id, 16);
1392 if (
i ==
buf->pdxf->nb_xtemplates)
1394 ERR(
"Unknown template %s\n", (
char*)
buf->value);
1404 buf->pxo->name[0] = 0;
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
int mszip_decompress(int inlen, int outlen, char *inbuffer, char *outbuffer) DECLSPEC_HIDDEN
#define MAX_STRINGS_BUFFER
#define _strnicmp(_String1, _String2, _MaxCount)
#define HeapFree(x, y, z)
void CDECL _exit(int exitcode)
_ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl sscanf(const char *, const char *,...) __WINE_CRT_SCANF_ATTR(2
_ACRTIMP size_t __cdecl strlen(const char *)
_ACRTIMP int __cdecl strcmp(const char *, const char *)
#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
#define memcpy(s1, s2, n)
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 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]
static struct wctab tab[]
_In_ XLATEOBJ _In_ XFORMOBJ * pxo