51#define UNDNAME_NO_COMPLEX_TYPE (0x8000)
108#define BLOCK_SIZE 1024
109#define AVAIL_SIZE (1024 - sizeof(void*))
165 a->start =
a->num =
a->max =
a->alloc = 0;
183 new =
und_alloc(sym, (
a->alloc = 32) *
sizeof(
a->elts[0]));
184 if (!
new)
return FALSE;
187 else if (
a->max >=
a->alloc)
189 new =
und_alloc(sym, (
a->alloc * 2) *
sizeof(
a->elts[0]));
190 if (!
new)
return FALSE;
191 memcpy(
new,
a->elts,
a->alloc *
sizeof(
a->elts[0]));
199 a->elts[
a->num][
len] =
'\0';
200 if (++
a->num >=
a->max)
a->max =
a->num;
205 for (
i =
a->max - 1;
i >= 0;
i--)
208 if (i < a->
start)
c =
'-';
209 else if (
i >=
a->num)
c =
'}';
227 WARN(
"Out of bounds: %p %d + %d >= %d\n",
231 TRACE(
"Returning %p[%d] => %s\n",
244 unsigned int len = 1,
i, sz;
259 case '%':
len++;
break;
286 case '%': *
p++ =
'%';
break;
362 struct array arg_collect;
363 char* args_str =
NULL;
387 if (z_term && sym->
current[0] ==
'Z')
405 if (z_term && sym->
current -
p > 1 && sym->
args.num < 20)
418 for (
i = 1;
i < arg_collect.
num;
i++)
423 last = args_str ? args_str : arg_collect.
elts[0];
435 const char *
str,
BOOL is_ms_keyword)
441 *where = *where ?
str_printf(sym,
"%s%s%s%s", *where, is_ms_keyword ?
" " :
"",
str, is_ms_keyword ?
"" :
" ") :
480 case 'A': qualif =
NULL;
break;
481 case 'B': qualif =
"const";
break;
482 case 'C': qualif =
"volatile";
break;
483 case 'D': qualif =
"const volatile";
break;
484 case 'Q': qualif =
NULL;
break;
485 case 'R': qualif =
"const";
break;
486 case 'S': qualif =
"volatile";
break;
487 case 'T': qualif =
"const volatile";
break;
488 default:
return FALSE;
492 xdt->
flags &= ~DT_NO_LRSEP_WS;
495 if (
ch >=
'Q' &&
ch <=
'T')
497 const char*
class = get_class_name(sym);
498 if (!
class)
return FALSE;
501 FIXME(
"Got pointer to class %s member without storage\n",
class);
506 else if (pclass) *pclass =
NULL;
526 const char* str_qualif;
533 case 'A':
ref =
" &"; str_qualif =
NULL;
break;
534 case 'B':
ref =
" &"; str_qualif =
" volatile";
break;
535 case 'P':
ref =
" *"; str_qualif =
NULL;
break;
536 case 'Q':
ref =
" *"; str_qualif =
" const";
break;
537 case 'R':
ref =
" *"; str_qualif =
" volatile";
break;
538 case 'S':
ref =
" *"; str_qualif =
" const volatile";
break;
540 case '$':
ref =
" &&"; str_qualif =
NULL;
break;
541 default:
return FALSE;
570 unsigned mark = sym->
stack.num;
614 sym->
stack.num = mark;
645 }
while (*++sym->
current !=
'@');
666 unsigned num_mark = sym->
names.num;
667 unsigned start_mark = sym->
names.start;
668 unsigned stack_mark = sym->
stack.num;
669 unsigned args_mark = sym->
args.num;
673 sym->
names.start = start_mark;
679 sym->
names.num = num_mark;
680 sym->
names.start = start_mark;
681 sym->
stack.num = stack_mark;
682 sym->
args.num = args_mark;
707 case '\0':
return FALSE;
709 case '0':
case '1':
case '2':
case '3':
710 case '4':
case '5':
case '6':
case '7':
761 unsigned int len, sz;
792 unsigned mark = sym->
stack.num;
797 sym->
stack.num = mark;
807 const char** exported,
unsigned flags)
809 *call_conv = *exported =
NULL;
815 if (((
ch -
'A') % 2) == 1) *exported =
"dll_export ";
818 case 'A':
case 'B': *call_conv =
"cdecl";
break;
819 case 'C':
case 'D': *call_conv =
"pascal";
break;
820 case 'E':
case 'F': *call_conv =
"thiscall";
break;
821 case 'G':
case 'H': *call_conv =
"stdcall";
break;
822 case 'I':
case 'J': *call_conv =
"fastcall";
break;
823 case 'K':
case 'L':
break;
824 case 'M': *call_conv =
"clrcall";
break;
825 default:
ERR(
"Unknown calling convention %c\n",
ch);
return FALSE;
830 if (((
ch -
'A') % 2) == 1) *exported =
"__dll_export ";
833 case 'A':
case 'B': *call_conv =
"__cdecl";
break;
834 case 'C':
case 'D': *call_conv =
"__pascal";
break;
835 case 'E':
case 'F': *call_conv =
"__thiscall";
break;
836 case 'G':
case 'H': *call_conv =
"__stdcall";
break;
837 case 'I':
case 'J': *call_conv =
"__fastcall";
break;
838 case 'K':
case 'L':
break;
839 case 'M': *call_conv =
"__clrcall";
break;
840 default:
ERR(
"Unknown calling convention %c\n",
ch);
return FALSE;
853 const char* type_string;
857 case 'C': type_string =
"signed char";
break;
858 case 'D': type_string =
"char";
break;
859 case 'E': type_string =
"unsigned char";
break;
860 case 'F': type_string =
"short";
break;
861 case 'G': type_string =
"unsigned short";
break;
862 case 'H': type_string =
"int";
break;
863 case 'I': type_string =
"unsigned int";
break;
864 case 'J': type_string =
"long";
break;
865 case 'K': type_string =
"unsigned long";
break;
866 case 'M': type_string =
"float";
break;
867 case 'N': type_string =
"double";
break;
868 case 'O': type_string =
"long double";
break;
869 case 'X': type_string =
"void";
break;
871 default: type_string =
NULL;
break;
882 const char* type_string;
886 case 'D': type_string =
"__int8";
break;
887 case 'E': type_string =
"unsigned __int8";
break;
888 case 'F': type_string =
"__int16";
break;
889 case 'G': type_string =
"unsigned __int16";
break;
890 case 'H': type_string =
"__int32";
break;
891 case 'I': type_string =
"unsigned __int32";
break;
892 case 'J': type_string =
"__int64";
break;
893 case 'K': type_string =
"unsigned __int64";
break;
894 case 'L': type_string =
"__int128";
break;
895 case 'M': type_string =
"unsigned __int128";
break;
896 case 'N': type_string =
"bool";
break;
897 case 'Q': type_string =
"char8_t";
break;
898 case 'S': type_string =
"char16_t";
break;
899 case 'U': type_string =
"char32_t";
break;
900 case 'W': type_string =
"wchar_t";
break;
901 default: type_string =
NULL;
break;
916 unsigned mark = sym->
stack.num;
919 &
fs->call_conv, &
fs->exported,
926 sym->
stack.num = mark;
953 case 'C':
case 'D':
case 'E':
case 'F':
case 'G':
954 case 'H':
case 'I':
case 'J':
case 'K':
case 'M':
955 case 'N':
case 'O':
case 'X':
case 'Z':
965 const char* struct_name =
NULL;
966 const char* type_name =
NULL;
974 case 'T': type_name =
"union ";
break;
975 case 'U': type_name =
"struct ";
break;
976 case 'V': type_name =
"class ";
break;
977 case 'Y': type_name =
"cointerface ";
break;
1007 const char *ptr_qualif;
1011 case 'P': ptr_qualif =
NULL;
break;
1012 case 'Q': ptr_qualif =
"const";
break;
1013 case 'R': ptr_qualif =
"volatile";
break;
1014 case 'S': ptr_qualif =
"const volatile";
break;
1024 const char* function_qualifier;
1036 fs.return_ct.left,
fs.return_ct.right,
fs.call_conv,
class, ptr_qualif);
1039 else if (*sym->
current ==
'6')
1049 fs.return_ct.left,
fs.return_ct.right,
fs.call_conv, ptr_qualif);
1065 ct->
left = enum_name;
1071 case '0':
case '1':
case '2':
case '3':
case '4':
1072 case '5':
case '6':
case '7':
case '8':
case '9':
1077 if (!ct->
left)
goto done;
1132 fs.return_ct.left,
fs.return_ct.right,
fs.call_conv,
fs.arguments);
1135 else if (*sym->
current ==
'B')
1137 unsigned mark = sym->
stack.num;
1139 const char* arr =
NULL;
1163 sym->
stack.num = mark;
1165 else if (*sym->
current ==
'C')
1174 else if (*sym->
current ==
'Q')
1179 else if (*sym->
current ==
'T')
1188 ERR(
"Unknown type %c\n", dt);
1204 const char* member_type =
NULL;
1225 case '0':
access =
"private: ";
break;
1226 case '1':
access =
"protected: ";
break;
1227 case '2':
access =
"public: ";
break;
1234 member_type =
"static ";
1241 case '0':
case '1':
case '2':
1242 case '3':
case '4':
case '5':
1244 unsigned mark = sym->
stack.num;
1251 sym->
stack.num = mark;
1276 member_type, ct.
left,
1294 const char* member_type =
NULL;
1296 const char* call_conv;
1297 const char* function_qualifier =
NULL;
1298 const char* exported;
1299 const char* args_str =
NULL;
1344 access_id = (*sym->
current -
'0') / 2;
1345 else if (*sym->
current ==
'R')
1346 access_id = (sym->
current[1] -
'0') / 2;
1347 else if (*sym->
current !=
'B')
1350 else if (accmem >=
'A' && accmem <=
'Z')
1351 access_id = (accmem -
'A') / 8;
1357 case 0:
access =
"private: ";
break;
1358 case 1:
access =
"protected: ";
break;
1359 case 2:
access =
"public: ";
break;
1361 if (accmem ==
'$' || (accmem -
'A') % 8 == 6 || (accmem -
'A') % 8 == 7)
1364 if (accmem ==
'$' && *sym->
current !=
'B')
1365 member_type =
"virtual ";
1366 else if (accmem <=
'X')
1368 switch ((accmem -
'A') % 8)
1370 case 2:
case 3: member_type =
"static ";
break;
1371 case 4:
case 5:
case 6:
case 7: member_type =
"virtual ";
break;
1382 if (accmem ==
'$' && *sym->
current ==
'B')
1389 if(!
n || *sym->
current++ !=
'A')
goto done;
1394 else if (accmem ==
'$' && *sym->
current ==
'R')
1404 if(!
n1 || !
n2 || !
n3 || !
n4)
goto done;
1407 else if (accmem ==
'$')
1409 const char *
n1, *
n2;
1415 if (!
n1 || !
n2)
goto done;
1418 else if ((accmem -
'A') % 8 == 6 || (accmem -
'A') % 8 == 7)
1421 if (has_args && (accmem ==
'$' ||
1422 (accmem <=
'X' && (accmem -
'A') % 8 != 2 && (accmem -
'A') % 8 != 3)))
1433 if (has_ret && *sym->
current ==
'@')
1435 ct_ret.
left =
"void";
1452 mark = sym->
stack.num;
1453 if (has_args && !(args_str =
get_args(sym,
TRUE,
'(',
')')))
goto done;
1456 sym->
stack.num = mark;
1464 call_conv, call_conv ?
" " :
NULL, exported,
1465 name, args_str, function_qualifier, ct_ret.
right);
1483 } post_process = PP_NONE;
1517 case '0':
function_name =
""; post_process = PP_CONSTRUCTOR;
break;
1518 case '1':
function_name =
""; post_process = PP_DESTRUCTOR;
break;
1528 case 'B':
function_name =
"operator"; post_process = PP_CAST_OPERATOR;
break;
1568 case 'C': sym->
result = (
char*)
"`string'";
1573 case 'E':
function_name =
"`vector deleting destructor'";
break;
1574 case 'F':
function_name =
"`default constructor closure'";
break;
1575 case 'G':
function_name =
"`scalar deleting destructor'";
break;
1576 case 'H':
function_name =
"`vector constructor iterator'";
break;
1577 case 'I':
function_name =
"`vector destructor iterator'";
break;
1578 case 'J':
function_name =
"`vector vbase constructor iterator'";
break;
1579 case 'K':
function_name =
"`virtual displacement map'";
break;
1580 case 'L':
function_name =
"`eh vector constructor iterator'";
break;
1581 case 'M':
function_name =
"`eh vector destructor iterator'";
break;
1582 case 'N':
function_name =
"`eh vector vbase constructor iterator'";
break;
1583 case 'O':
function_name =
"`copy constructor closure'";
break;
1614 case '3':
function_name =
"`RTTI Class Hierarchy Descriptor'";
break;
1615 case '4':
function_name =
"`RTTI Complete Object Locator'";
break;
1617 ERR(
"Unknown RTTI operator: _R%c\n", *sym->
current);
1622 case 'T':
function_name =
"`local vftable constructor closure'";
break;
1625 case 'X':
function_name =
"`placement delete closure'";
break;
1626 case 'Y':
function_name =
"`placement delete[] closure'";
break;
1641 ERR(
"Unknown operator: _%c\n", *sym->
current);
1652 ERR(
"Unknown operator: %c\n", *sym->
current);
1658 unsigned args_mark = sym->
args.num;
1663 sym->
args.num = args_mark;
1669 else if (*sym->
current ==
'$')
1681 case '@': sym->
current++;
break;
1689 switch (post_process)
1691 case PP_NONE:
default:
break;
1692 case PP_CONSTRUCTOR:
case PP_DESTRUCTOR:
1694 if (sym->
stack.num <= 1)
goto done;
1695 sym->
stack.elts[0] =
str_printf(sym,
"%s%s%s", post_process == PP_DESTRUCTOR ?
"~" :
NULL,
1700 case PP_CAST_OPERATOR:
1701 sym->
flags &= ~UNDNAME_NO_FUNCTION_RETURNS;
1743 TRACE(
"(%p,%s,%d,%p,%p,%p,%x)\n",
1785 unsigned short int flags)
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
#define UNDNAME_NO_MS_KEYWORDS
#define UNDNAME_NO_THISTYPE
#define UNDNAME_NO_LEADING_UNDERSCORES
#define UNDNAME_NO_ALLOCATION_LANGUAGE
#define UNDNAME_NO_ARGUMENTS
#define UNDNAME_NO_FUNCTION_RETURNS
#define UNDNAME_NO_ACCESS_SPECIFIERS
#define UNDNAME_NO_MEMBER_TYPE
static WCHAR unknown[MAX_STRING_RESOURCE_LEN]
#define UNDNAME_NAME_ONLY
_ACRTIMP int __cdecl atoi(const char *)
_ACRTIMP size_t __cdecl strlen(const char *)
void *(__cdecl * malloc_func_t)(size_t)
void(__cdecl * free_func_t)(void *)
static void und_free_all(struct parsed_symbol *sym)
static BOOL demangle_datatype(struct parsed_symbol *sym, struct datatype_t *ct, enum datatype_flags flags)
static BOOL get_qualified_type(struct datatype_t *ct, struct parsed_symbol *sym, char qualif, enum datatype_flags flags)
static const char * get_number(struct parsed_symbol *sym)
static BOOL symbol_demangle(struct parsed_symbol *sym)
static BOOL get_calling_convention(char ch, const char **call_conv, const char **exported, unsigned flags)
static void str_array_init(struct array *a)
static char * get_args(struct parsed_symbol *sym, BOOL z_term, char open_char, char close_char)
static char * get_literal_string(struct parsed_symbol *sym)
#define UNDNAME_NO_COMPLEX_TYPE
static char *WINAPIV str_printf(struct parsed_symbol *sym, const char *format,...)
static BOOL get_function_qualifier(struct parsed_symbol *sym, const char **qualif)
static BOOL str_array_push(struct parsed_symbol *sym, const char *ptr, int len, struct array *a)
static BOOL get_class(struct parsed_symbol *sym)
static const char * get_extended_type(char c)
char *CDECL __unDNameEx(char *buffer, const char *mangled, int buflen, malloc_func_t memget, free_func_t memfree, void *unknown, unsigned short int flags)
static char * get_class_string(struct parsed_symbol *sym, int start)
static BOOL handle_method(struct parsed_symbol *sym, BOOL cast_op)
static BOOL get_qualifier(struct parsed_symbol *sym, struct datatype_t *xdt, const char **pclass)
static char * get_template_name(struct parsed_symbol *sym)
static void * und_alloc(struct parsed_symbol *sym, unsigned int len)
static char * str_array_get_ref(struct array *cref, unsigned idx)
static BOOL get_function_signature(struct parsed_symbol *sym, struct function_signature *fs)
static const char * get_simple_type(char c)
static char * get_class_name(struct parsed_symbol *sym)
char *CDECL __unDName(char *buffer, const char *mangled, int buflen, malloc_func_t memget, free_func_t memfree, unsigned short int flags)
static BOOL handle_data(struct parsed_symbol *sym)
static void append_extended_qualifier(struct parsed_symbol *sym, const char **where, const char *str, BOOL is_ms_keyword)
static void get_extended_qualifier(struct parsed_symbol *sym, struct datatype_t *xdt)
GLuint GLint GLboolean GLint GLenum access
GLboolean GLboolean GLboolean GLboolean a
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
wchar_t const *const function_name
#define memcpy(s1, s2, n)
static unsigned __int64 next
struct datatype_t return_ct
malloc_func_t mem_alloc_ptr