25#define MAKEFOUR(a,b,c,d) ((DWORD)a + ((DWORD)b << 8) + ((DWORD)c << 16) + ((DWORD)d << 24))
26#define XOFFILE_FORMAT_MAGIC MAKEFOUR('x','o','f',' ')
27#define XOFFILE_FORMAT_VERSION_302 MAKEFOUR('0','3','0','2')
28#define XOFFILE_FORMAT_VERSION_303 MAKEFOUR('0','3','0','3')
29#define XOFFILE_FORMAT_BINARY MAKEFOUR('b','i','n',' ')
30#define XOFFILE_FORMAT_TEXT MAKEFOUR('t','x','t',' ')
31#define XOFFILE_FORMAT_BINARY_MSZIP MAKEFOUR('b','z','i','p')
32#define XOFFILE_FORMAT_TEXT_MSZIP MAKEFOUR('t','z','i','p')
33#define XOFFILE_FORMAT_COMPRESSED MAKEFOUR('c','m','p',' ')
34#define XOFFILE_FORMAT_FLOAT_BITS_32 MAKEFOUR('0','0','3','2')
35#define XOFFILE_FORMAT_FLOAT_BITS_64 MAKEFOUR('0','0','6','4')
37#define TOKEN_ERROR 0xffff
41#define TOKEN_INTEGER 3
43#define TOKEN_INTEGER_LIST 6
44#define TOKEN_FLOAT_LIST 7
45#define TOKEN_OBRACE 10
46#define TOKEN_CBRACE 11
47#define TOKEN_OPAREN 12
48#define TOKEN_CPAREN 13
49#define TOKEN_OBRACKET 14
50#define TOKEN_CBRACKET 15
51#define TOKEN_OANGLE 16
52#define TOKEN_CANGLE 17
55#define TOKEN_SEMICOLON 20
56#define TOKEN_TEMPLATE 31
60#define TOKEN_DOUBLE 43
64#define TOKEN_SDWORD 47
67#define TOKEN_UNICODE 50
68#define TOKEN_CSTRING 51
71#define CLSIDFMT "<%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X>"
181 TRACE(
"header = '%s'\n",
string);
212 DWORD decomp_file_size;
213 WORD decomp_chunk_size;
214 WORD comp_chunk_size;
217 if (!
read_bytes(
buf, &decomp_file_size,
sizeof(decomp_file_size)))
220 TRACE(
"Compressed format %s detected: decompressed file size with xof header = %lu.\n",
224 decomp_file_size -= 16;
229 ERR(
"Out of memory\n");
232 *decomp_buffer_ptr = decomp_buffer;
234 while (
buf->rem_bytes)
236 if (!
read_bytes(
buf, &decomp_chunk_size,
sizeof(decomp_chunk_size)))
238 if (!
read_bytes(
buf, &comp_chunk_size,
sizeof(comp_chunk_size)))
241 TRACE(
"Process chunk: compressed_size = %d, decompressed_size = %d\n",
242 comp_chunk_size, decomp_chunk_size);
247 WARN(
"Error while decompressing MSZIP chunk %d\n",
err);
251 buf->rem_bytes -= comp_chunk_size;
252 buf->buffer += comp_chunk_size;
253 decomp_buffer += decomp_chunk_size;
256 if ((decomp_buffer - *decomp_buffer_ptr) != decomp_file_size)
257 ERR(
"Size of all decompressed chunks (%Iu) does not match decompressed file size (%lu).\n",
258 decomp_buffer - *decomp_buffer_ptr, decomp_file_size);
261 buf->buffer = *decomp_buffer_ptr;
262 buf->rem_bytes = decomp_file_size;
265 TRACE(
"Header is correct\n");
272#define DUMP_TOKEN(t) case t: TRACE(#t "\n"); break
446 if (
buf->rem_bytes < 38 || *
buf->buffer !=
'<')
449 while (
pos <
sizeof(tmp) - 2 && *(
buf->buffer+
pos) !=
'>')
458 TRACE(
"Wrong guid %s (%lu).\n", tmp,
pos);
464 ret =
sscanf(tmp,
"<%08lx-%04lx-%04lx-%02lx%02lx-%02lx%02lx%02lx%02lx%02lx%02lx>",
465 &class_id.Data1,
tab,
tab+1,
tab+2,
tab+3,
tab+4,
tab+5,
tab+6,
tab+7,
tab+8,
tab+9);
468 TRACE(
"Wrong guid %s (%lu).\n", tmp,
pos);
471 TRACE(
"Found guid %s (%lu).\n", tmp,
pos);
473 class_id.Data2 =
tab[0];
474 class_id.Data3 =
tab[1];
475 class_id.Data4[0] =
tab[2];
476 class_id.Data4[1] =
tab[3];
477 class_id.Data4[2] =
tab[4];
478 class_id.Data4[3] =
tab[5];
479 class_id.Data4[4] =
tab[6];
480 class_id.Data4[5] =
tab[7];
481 class_id.Data4[6] =
tab[8];
482 class_id.Data4[7] =
tab[9];
497 if (!(((
c >=
'a') && (
c <=
'z')) || ((
c >=
'A') && (
c <=
'Z')) || ((
c >=
'0') && (
c <=
'9')) || (
c ==
'_') || (
c ==
'-')))
499 if (
pos <
sizeof(tmp))
503 tmp[
min(
pos,
sizeof(tmp) - 1)] = 0;
507 TRACE(
"Wrong name %s\n", tmp);
514 TRACE(
"Found name %s\n", tmp);
530 if (!((!
pos && (
c ==
'-')) || ((
c >=
'0') && (
c <=
'9')) || (!dot && (
c ==
'.'))))
534 if (
pos <
sizeof(tmp))
538 tmp[
min(
pos,
sizeof(tmp) - 1)] = 0;
543 sscanf(tmp,
"%f", &decimal);
545 TRACE(
"Found float %s - %f\n", tmp, decimal);
547 *(
float*)
buf->value = decimal;
561 if (!((
c >=
'0') && (
c <=
'9')))
563 if (
pos <
sizeof(tmp))
567 tmp[
min(
pos,
sizeof(tmp) - 1)] = 0;
588 if (*
buf->buffer !=
'"')
591 while ((
pos+1) <
buf->rem_bytes)
599 if (
pos <
sizeof(tmp))
603 tmp[
min(
pos,
sizeof(tmp) - 1)] = 0;
607 TRACE(
"Wrong string %s\n", tmp);
612 buf->rem_bytes -=
pos + 2;
614 TRACE(
"Found string %s\n", tmp);
631 if ((
c ==
'#') || (
c ==
'/'))
694 FIXME(
"Unrecognize element\n");
701 if (!
buf->list_nb_elements)
713 TRACE(
"Integer list (TOKEN_INTEGER_LIST) of size %lu.\n",
buf->list_nb_elements);
721 TRACE(
"Float list (TOKEN_FLOAT_LIST) of size %lu.\n",
buf->list_nb_elements);
725 if (
buf->list_nb_elements)
727 if (
buf->list_separator)
729 buf->list_nb_elements--;
756 char *
name = (
char*)
buf->value;
784 sprintf(strguid,
CLSIDFMT, class_id.Data1, class_id.Data2, class_id.Data3, class_id.Data4[0],
785 class_id.Data4[1], class_id.Data4[2], class_id.Data4[3], class_id.Data4[4], class_id.Data4[5],
786 class_id.Data4[6], class_id.Data4[7]);
787 TRACE(
"guid = %s\n", strguid);
795 char *
string = (
char*)
buf->value;
802 TRACE(
"string = %s\n",
string);
845 if (
buf->token_present)
848 return buf->current_token;
853 return buf->current_token;
858 if (
buf->token_present)
859 return buf->current_token;
864 return buf->current_token;
894 xtemplate* cur_template = &
buf->pdxf->xtemplates[
buf->pdxf->nb_xtemplates];
934 cur_member = &
buf->pdxf->xtemplates[
buf->pdxf->nb_xtemplates].members[idx_member];
945 if (!
strcmp((
char*)
buf->value,
"indexColor"))
961 WARN(
"Reference to a nonexistent template '%s'\n", (
char*)
buf->value);
981 FIXME(
"Too many dimensions (%d) for multi-dimensional array\n", nb_dims + 1);
996 for (
i = 0;
i < idx_member;
i++)
998 if (!
strcmp((
char*)
buf->value,
buf->pdxf->xtemplates[
buf->pdxf->nb_xtemplates].members[
i].name))
1000 if (
buf->pdxf->xtemplates[
buf->pdxf->nb_xtemplates].members[
i].nb_dims)
1002 ERR(
"Array cannot be used to specify variable array size\n");
1007 FIXME(
"Only DWORD supported to specify variable array size\n");
1013 if (
i == idx_member)
1015 ERR(
"Reference to unknown member %s\n", (
char*)
buf->value);
1027 cur_member->
nb_dims = nb_dims;
1035 buf->pdxf->xtemplates[
buf->pdxf->nb_xtemplates].nb_members = idx_member;
1062 strcpy(
buf->pdxf->xtemplates[
buf->pdxf->nb_xtemplates].name, (
char*)
buf->value);
1073 TRACE(
"%lu - %s - %s\n",
buf->pdxf->nb_xtemplates,
buf->pdxf->xtemplates[
buf->pdxf->nb_xtemplates].name,
1075 buf->pdxf->nb_xtemplates++;
1088 WARN(
"Template is not correct\n");
1093 TRACE(
"Template successfully parsed:\n");
1103 if ((
buf->cur_pos_data +
size) >
buf->capacity)
1106 ULONG new_capacity =
buf->capacity ? 2 *
buf->capacity : 100000;
1113 buf->capacity = new_capacity;
1127 buf->pxo->nb_members =
pt->nb_members;
1129 for (
i = 0;
i <
pt->nb_members;
i++)
1136 buf->pxo->members[
i].start =
buf->cur_pos_data;
1138 for (
k = 0;
k <
pt->members[
i].nb_dims;
k++)
1140 if (
pt->members[
i].dim_fixed[
k])
1141 nb_elems *=
pt->members[
i].dim_value[
k];
1143 nb_elems *= *(
DWORD*)(
buf->pxo->root->pdata +
buf->pxo->members[
pt->members[
i].dim_value[
k]].start);
1146 TRACE(
"Elements to consider: %lu.\n", nb_elems);
1148 for (
k = 0;
k < nb_elems;
k++)
1154 TRACE(
"Found sub-object %s\n",
buf->pdxf->xtemplates[
pt->members[
i].idx_template].name);
1158 for (
j = 0;
j <
buf->pdxf->nb_xtemplates;
j++)
1160 if (!
stricmp(
buf->pdxf->xtemplates[
pt->members[
i].idx_template].name,
buf->pdxf->xtemplates[
j].name))
1162 buf->pxt[
buf->level] = &
buf->pdxf->xtemplates[
j];
1166 if (
j ==
buf->pdxf->nb_xtemplates)
1168 ERR(
"Unknown template %s\n", (
char*)
buf->value);
1172 TRACE(
"Enter %s\n",
buf->pdxf->xtemplates[
pt->members[
i].idx_template].name);
1193 buf->cur_pos_data += 2;
1198 buf->cur_pos_data += 4;
1202 FIXME(
"Token %ld not supported.\n",
pt->members[
i].type);
1214 *(
float *)(
buf->pdata +
buf->cur_pos_data) = *(
float *)
buf->
value;
1215 buf->cur_pos_data += 4;
1219 FIXME(
"Token %ld not supported.\n",
pt->members[
i].type);
1234 FIXME(
"Buffer too small %p %p %d\n",
buf->cur_pstrings,
buf->pstrings,
len);
1238 *(((
LPCSTR*)(
buf->pdata +
buf->cur_pos_data))) = (
char*)
buf->cur_pstrings;
1239 buf->cur_pstrings +=
len;
1240 buf->cur_pos_data +=
sizeof(
LPSTR);
1244 FIXME(
"Token %ld not supported.\n",
pt->members[
i].type);
1269 buf->pxo->members[
i].size =
buf->cur_pos_data -
buf->pxo->members[
i].start;
1277 buf->pxo->nb_children = 0;
1284 buf->pxo->size =
buf->cur_pos_data -
buf->pxo->pos_data;
1296 TRACE(
"Found optional reference %s\n", (
char*)
buf->value);
1297 for (
i = 0;
i < (
buf->nb_pxo_globals+1);
i++)
1299 for (
j = 0;
j < (
buf->pxo_globals[
i])[0].nb_subobjects;
j++)
1306 if (
i == (
buf->nb_pxo_globals+1))
1308 ERR(
"Reference to unknown object %s\n", (
char*)
buf->value);
1314 FIXME(
"Too many sub-objects\n");
1318 buf->pxo->children[
buf->pxo->nb_children] = &
buf->pxo_tab[
buf->pxo->root->nb_subobjects++];
1319 buf->pxo->children[
buf->pxo->nb_children]->ptarget = &(
buf->pxo_globals[
i])[
j];
1320 buf->pxo->children[
buf->pxo->nb_children]->binary =
FALSE;
1321 buf->pxo->nb_children++;
1329 FIXME(
"Too many sub-objects\n");
1333 buf->pxo =
buf->pxo->children[
buf->pxo->nb_children] = &
buf->pxo_tab[
buf->pxo->root->nb_subobjects];
1334 pxo->root->nb_subobjects++;
1336 TRACE(
"Enter optional %s\n", (
char*)
buf->value);
1345 buf->pxo->nb_children++;
1354 FIXME(
"Too many children: %lu.\n",
buf->pxo->nb_children);
1365 buf->pxo->pos_data =
buf->cur_pos_data;
1368 buf->pxo->root =
buf->pxo_tab;
1374 for (
i = 0;
i <
buf->pdxf->nb_xtemplates;
i++)
1378 buf->pxt[
buf->level] = &
buf->pdxf->xtemplates[
i];
1379 memcpy(&
buf->pxo->type, &
buf->pdxf->xtemplates[
i].class_id, 16);
1383 if (
i ==
buf->pdxf->nb_xtemplates)
1385 ERR(
"Unknown template %s\n", (
char*)
buf->value);
1395 buf->pxo->name[0] = 0;
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
int mszip_decompress(int inlen, int outlen, char *inbuffer, char *outbuffer)
#define MAX_STRINGS_BUFFER
#define _strnicmp(_String1, _String2, _MaxCount)
#define stricmp(_String1, _String2)
#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
static __inline const char * debugstr_fourcc(unsigned int cc)
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