22#define __WINE_DEBUG_CHANNEL__
100#define BLOCK_SIZE 1024
101#define AVAIL_SIZE (1024 - sizeof(void*))
157 a->start =
a->num =
a->max =
a->alloc = 0;
175 new =
und_alloc(sym, (
a->alloc = 32) *
sizeof(
a->elts[0]));
176 if (!
new)
return FALSE;
179 else if (
a->max >=
a->alloc)
181 new =
und_alloc(sym, (
a->alloc * 2) *
sizeof(
a->elts[0]));
182 if (!
new)
return FALSE;
183 memcpy(
new,
a->elts,
a->alloc *
sizeof(
a->elts[0]));
191 a->elts[
a->num][
len] =
'\0';
192 if (++
a->num >=
a->max)
a->max =
a->num;
197 for (
i =
a->max - 1;
i >= 0;
i--)
200 if (i < a->
start)
c =
'-';
201 else if (
i >=
a->num)
c =
'}';
220 WARN(
"Out of bounds: %p %d + %d >= %d\n",
224 TRACE(
"Returning %p[%d] => %s\n",
237 unsigned int len = 1,
i, sz;
252 case '%':
len++;
break;
279 case '%': *
p++ =
'%';
break;
349 struct array arg_collect;
350 char* args_str =
NULL;
368 if (z_term && !
strcmp(ct.
left,
"void"))
break;
379 if (arg_collect.
num == 0 ||
380 (arg_collect.
num == 1 && !
strcmp(arg_collect.
elts[0],
"void")))
382 for (
i = 1;
i < arg_collect.
num;
i++)
387 last = args_str ? args_str : arg_collect.
elts[0];
409 *ptr_modif =
"__ptr64";
411 *ptr_modif = *ptr_modif + 2;
418 case 'B': *
ret =
"const";
break;
419 case 'C': *
ret =
"volatile";
break;
420 case 'D': *
ret =
"const volatile";
break;
421 default:
return FALSE;
427 struct array *pmt_ref,
char modif,
BOOL in_args)
429 const char* modifier;
430 const char* str_modif;
431 const char *ptr_modif =
"";
438 ptr_modif =
" ptr64";
440 ptr_modif =
" __ptr64";
447 case 'A': str_modif =
str_printf(sym,
" &%s", ptr_modif);
break;
448 case 'B': str_modif =
str_printf(sym,
" &%s volatile", ptr_modif);
break;
449 case 'P': str_modif =
str_printf(sym,
" *%s", ptr_modif);
break;
450 case 'Q': str_modif =
str_printf(sym,
" *%s const", ptr_modif);
break;
451 case 'R': str_modif =
str_printf(sym,
" *%s volatile", ptr_modif);
break;
452 case 'S': str_modif =
str_printf(sym,
" *%s const volatile", ptr_modif);
break;
453 case '?': str_modif =
"";
break;
454 default:
return FALSE;
459 unsigned mark = sym->
stack.num;
472 if (str_modif[0] ==
' ' && !modifier)
477 str_modif =
str_printf(sym,
" (%s%s)", modifier, str_modif);
481 str_modif =
str_printf(sym,
" (%s)", str_modif);
495 if (!in_args && str_modif[0] && str_modif[1] ==
'*' && sub_ct.
left[
strlen(sub_ct.
left)-1] ==
'*')
500 sym->
stack.num = mark;
524 }
while (*++sym->
current !=
'@');
545 unsigned num_mark = sym->
names.num;
546 unsigned start_mark = sym->
names.start;
547 unsigned stack_mark = sym->
stack.num;
548 struct array array_pmt;
552 sym->
names.start = start_mark;
559 sym->
names.num = num_mark;
560 sym->
names.start = start_mark;
561 sym->
stack.num = stack_mark;
586 case '\0':
return FALSE;
588 case '0':
case '1':
case '2':
case '3':
589 case '4':
case '5':
case '6':
case '7':
640 unsigned int len, sz;
671 unsigned mark = sym->
stack.num;
676 sym->
stack.num = mark;
686 const char** exported,
unsigned flags)
688 *call_conv = *exported =
NULL;
694 if (((ch -
'A') % 2) == 1) *exported =
"dll_export ";
697 case 'A':
case 'B': *call_conv =
"cdecl";
break;
698 case 'C':
case 'D': *call_conv =
"pascal";
break;
699 case 'E':
case 'F': *call_conv =
"thiscall";
break;
700 case 'G':
case 'H': *call_conv =
"stdcall";
break;
701 case 'I':
case 'J': *call_conv =
"fastcall";
break;
702 case 'K':
case 'L':
break;
703 case 'M': *call_conv =
"clrcall";
break;
704 default:
ERR(
"Unknown calling convention %c\n", ch);
return FALSE;
709 if (((ch -
'A') % 2) == 1) *exported =
"__dll_export ";
712 case 'A':
case 'B': *call_conv =
"__cdecl";
break;
713 case 'C':
case 'D': *call_conv =
"__pascal";
break;
714 case 'E':
case 'F': *call_conv =
"__thiscall";
break;
715 case 'G':
case 'H': *call_conv =
"__stdcall";
break;
716 case 'I':
case 'J': *call_conv =
"__fastcall";
break;
717 case 'K':
case 'L':
break;
718 case 'M': *call_conv =
"__clrcall";
break;
719 default:
ERR(
"Unknown calling convention %c\n", ch);
return FALSE;
732 const char* type_string;
736 case 'C': type_string =
"signed char";
break;
737 case 'D': type_string =
"char";
break;
738 case 'E': type_string =
"unsigned char";
break;
739 case 'F': type_string =
"short";
break;
740 case 'G': type_string =
"unsigned short";
break;
741 case 'H': type_string =
"int";
break;
742 case 'I': type_string =
"unsigned int";
break;
743 case 'J': type_string =
"long";
break;
744 case 'K': type_string =
"unsigned long";
break;
745 case 'M': type_string =
"float";
break;
746 case 'N': type_string =
"double";
break;
747 case 'O': type_string =
"long double";
break;
748 case 'X': type_string =
"void";
break;
749 case 'Z': type_string =
"...";
break;
750 default: type_string =
NULL;
break;
761 const char* type_string;
765 case 'D': type_string =
"__int8";
break;
766 case 'E': type_string =
"unsigned __int8";
break;
767 case 'F': type_string =
"__int16";
break;
768 case 'G': type_string =
"unsigned __int16";
break;
769 case 'H': type_string =
"__int32";
break;
770 case 'I': type_string =
"unsigned __int32";
break;
771 case 'J': type_string =
"__int64";
break;
772 case 'K': type_string =
"unsigned __int64";
break;
773 case 'L': type_string =
"__int128";
break;
774 case 'M': type_string =
"unsigned __int128";
break;
775 case 'N': type_string =
"bool";
break;
776 case 'W': type_string =
"wchar_t";
break;
777 default: type_string =
NULL;
break;
804 case 'C':
case 'D':
case 'E':
case 'F':
case 'G':
805 case 'H':
case 'I':
case 'J':
case 'K':
case 'M':
806 case 'N':
case 'O':
case 'X':
case 'Z':
817 const char* struct_name =
NULL;
818 const char* type_name =
NULL;
826 case 'T': type_name =
"union ";
break;
827 case 'U': type_name =
"struct ";
break;
828 case 'V': type_name =
"class ";
break;
829 case 'Y': type_name =
"cointerface ";
break;
855 if (!
get_modified_type(ct, sym, pmt_ref, in_args ? dt :
'P', in_args))
goto done;
867 const char* call_conv;
868 const char* exported;
870 unsigned mark = sym->
stack.num;
872 const char* modifier;
873 const char* ptr_modif;
882 modifier =
str_printf(sym,
"%s %s", modifier, ptr_modif);
883 else if(ptr_modif[0])
886 &call_conv, &exported,
893 if (!
args)
goto done;
894 sym->
stack.num = mark;
897 sub_ct.
left, sub_ct.
right, call_conv,
class);
903 const char* call_conv;
904 const char* exported;
906 unsigned mark = sym->
stack.num;
911 &call_conv, &exported,
917 if (!
args)
goto done;
918 sym->
stack.num = mark;
936 ct->
left = enum_name;
942 case '0':
case '1':
case '2':
case '3':
case '4':
943 case '5':
case '6':
case '7':
case '8':
case '9':
946 if (!pmt_ref)
goto done;
949 if (!ct->
left)
goto done;
995 unsigned mark = sym->
stack.num;
997 const char* arr =
NULL;
1021 sym->
stack.num = mark;
1023 else if (*sym->
current ==
'C')
1025 const char *
ptr, *ptr_modif;
1036 ERR(
"Unknown type %c\n", dt);
1039 if (add_pmt && pmt_ref && in_args)
1059 const char* member_type =
NULL;
1060 const char* modifier =
NULL;
1061 const char* ptr_modif;
1081 case '0':
access =
"private: ";
break;
1082 case '1':
access =
"protected: ";
break;
1083 case '2':
access =
"public: ";
break;
1090 member_type =
"static ";
1097 case '0':
case '1':
case '2':
1098 case '3':
case '4':
case '5':
1100 unsigned mark = sym->
stack.num;
1106 if (!
get_modifier(sym, &modifier, &ptr_modif))
goto done;
1107 if (modifier && ptr_modif) modifier =
str_printf(sym,
"%s %s", modifier, ptr_modif);
1108 else if (!modifier) modifier = ptr_modif;
1109 sym->
stack.num = mark;
1115 if (!
get_modifier(sym, &modifier, &ptr_modif))
goto done;
1134 member_type, ct.
left,
1135 modifier && ct.
left ?
" " :
NULL, modifier,
1152 const char* member_type =
NULL;
1154 const char* call_conv;
1155 const char* modifier =
NULL;
1156 const char* exported;
1157 const char* args_str =
NULL;
1161 struct array array_pmt;
1203 access_id = (*sym->
current -
'0') / 2;
1204 else if (*sym->
current ==
'R')
1205 access_id = (sym->
current[1] -
'0') / 2;
1206 else if (*sym->
current !=
'B')
1209 else if (accmem >=
'A' && accmem <=
'Z')
1210 access_id = (accmem -
'A') / 8;
1216 case 0:
access =
"private: ";
break;
1217 case 1:
access =
"protected: ";
break;
1218 case 2:
access =
"public: ";
break;
1220 if (accmem ==
'$' || (accmem -
'A') % 8 == 6 || (accmem -
'A') % 8 == 7)
1223 if (accmem ==
'$' && *sym->
current !=
'B')
1224 member_type =
"virtual ";
1225 else if (accmem <=
'X')
1227 switch ((accmem -
'A') % 8)
1229 case 2:
case 3: member_type =
"static ";
break;
1230 case 4:
case 5:
case 6:
case 7: member_type =
"virtual ";
break;
1241 if (accmem ==
'$' && *sym->
current ==
'B')
1248 if(!
n || *sym->
current++ !=
'A')
goto done;
1253 else if (accmem ==
'$' && *sym->
current ==
'R')
1263 if(!
n1 || !
n2 || !
n3 || !
n4)
goto done;
1266 else if (accmem ==
'$')
1268 const char *
n1, *
n2;
1274 if (!
n1 || !
n2)
goto done;
1277 else if ((accmem -
'A') % 8 == 6 || (accmem -
'A') % 8 == 7)
1280 if (has_args && (accmem ==
'$' ||
1281 (accmem <=
'X' && (accmem -
'A') % 8 != 2 && (accmem -
'A') % 8 != 3)))
1283 const char *ptr_modif;
1286 if (!
get_modifier(sym, &modifier, &ptr_modif))
goto done;
1287 if (modifier || ptr_modif) modifier =
str_printf(sym,
"%s %s", modifier, ptr_modif);
1297 if (has_ret && *sym->
current ==
'@')
1299 ct_ret.
left =
"void";
1316 mark = sym->
stack.num;
1317 if (has_args && !(args_str =
get_args(sym, &array_pmt,
TRUE,
'(',
')')))
goto done;
1320 sym->
stack.num = mark;
1328 call_conv, call_conv ?
" " :
NULL, exported,
1329 name, args_str, modifier, ct_ret.
right);
1342 unsigned do_after = 0;
1343 static CHAR dashed_null[] =
"--null--";
1365 const char* function_name =
NULL;
1376 case '0': do_after = 1;
break;
1377 case '1': do_after = 2;
break;
1378 case '2': function_name =
"operator new";
break;
1379 case '3': function_name =
"operator delete";
break;
1380 case '4': function_name =
"operator=";
break;
1381 case '5': function_name =
"operator>>";
break;
1382 case '6': function_name =
"operator<<";
break;
1383 case '7': function_name =
"operator!";
break;
1384 case '8': function_name =
"operator==";
break;
1385 case '9': function_name =
"operator!=";
break;
1386 case 'A': function_name =
"operator[]";
break;
1387 case 'B': function_name =
"operator "; do_after = 3;
break;
1388 case 'C': function_name =
"operator->";
break;
1389 case 'D': function_name =
"operator*";
break;
1390 case 'E': function_name =
"operator++";
break;
1391 case 'F': function_name =
"operator--";
break;
1392 case 'G': function_name =
"operator-";
break;
1393 case 'H': function_name =
"operator+";
break;
1394 case 'I': function_name =
"operator&";
break;
1395 case 'J': function_name =
"operator->*";
break;
1396 case 'K': function_name =
"operator/";
break;
1397 case 'L': function_name =
"operator%";
break;
1398 case 'M': function_name =
"operator<";
break;
1399 case 'N': function_name =
"operator<=";
break;
1400 case 'O': function_name =
"operator>";
break;
1401 case 'P': function_name =
"operator>=";
break;
1402 case 'Q': function_name =
"operator,";
break;
1403 case 'R': function_name =
"operator()";
break;
1404 case 'S': function_name =
"operator~";
break;
1405 case 'T': function_name =
"operator^";
break;
1406 case 'U': function_name =
"operator|";
break;
1407 case 'V': function_name =
"operator&&";
break;
1408 case 'W': function_name =
"operator||";
break;
1409 case 'X': function_name =
"operator*=";
break;
1410 case 'Y': function_name =
"operator+=";
break;
1411 case 'Z': function_name =
"operator-=";
break;
1415 case '0': function_name =
"operator/=";
break;
1416 case '1': function_name =
"operator%=";
break;
1417 case '2': function_name =
"operator>>=";
break;
1418 case '3': function_name =
"operator<<=";
break;
1419 case '4': function_name =
"operator&=";
break;
1420 case '5': function_name =
"operator|=";
break;
1421 case '6': function_name =
"operator^=";
break;
1422 case '7': function_name =
"`vftable'";
break;
1423 case '8': function_name =
"`vbtable'";
break;
1424 case '9': function_name =
"`vcall'";
break;
1425 case 'A': function_name =
"`typeof'";
break;
1426 case 'B': function_name =
"`local static guard'";
break;
1427 case 'C': function_name =
"`string'"; do_after = 4;
break;
1428 case 'D': function_name =
"`vbase destructor'";
break;
1429 case 'E': function_name =
"`vector deleting destructor'";
break;
1430 case 'F': function_name =
"`default constructor closure'";
break;
1431 case 'G': function_name =
"`scalar deleting destructor'";
break;
1432 case 'H': function_name =
"`vector constructor iterator'";
break;
1433 case 'I': function_name =
"`vector destructor iterator'";
break;
1434 case 'J': function_name =
"`vector vbase constructor iterator'";
break;
1435 case 'K': function_name =
"`virtual displacement map'";
break;
1436 case 'L': function_name =
"`eh vector constructor iterator'";
break;
1437 case 'M': function_name =
"`eh vector destructor iterator'";
break;
1438 case 'N': function_name =
"`eh vector vbase constructor iterator'";
break;
1439 case 'O': function_name =
"`copy constructor closure'";
break;
1454 function_name =
str_printf(sym,
"%s%s `RTTI Type Descriptor'",
1468 function_name =
str_printf(sym,
"`RTTI Base Class Descriptor at (%s,%s,%s,%s)'",
1472 case '2': function_name =
"`RTTI Base Class Array'";
break;
1473 case '3': function_name =
"`RTTI Class Hierarchy Descriptor'";
break;
1474 case '4': function_name =
"`RTTI Complete Object Locator'";
break;
1476 ERR(
"Unknown RTTI operator: _R%c\n", *sym->
current);
1480 case 'S': function_name =
"`local vftable'";
break;
1481 case 'T': function_name =
"`local vftable constructor closure'";
break;
1482 case 'U': function_name =
"operator new[]";
break;
1483 case 'V': function_name =
"operator delete[]";
break;
1484 case 'X': function_name =
"`placement delete closure'";
break;
1485 case 'Y': function_name =
"`placement delete[] closure'";
break;
1487 ERR(
"Unknown operator: _%c\n", *sym->
current);
1493 ERR(
"Unknown operator: %c\n", *sym->
current);
1504 sym->
result = (
char*)function_name;
1510 struct array array_pmt;
1524 else if (*sym->
current ==
'$')
1538 case '@': sym->
current++;
break;
1548 case 0:
default:
break;
1551 if (sym->
stack.num <= 1)
goto done;
1560 sym->
flags &= ~UNDNAME_NO_FUNCTION_RETURNS;
1605 TRACE(
"(%p,%s,%d,%p,%p,%p,%x)\n",
1647 unsigned short int flags)
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)
#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
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
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
_Check_return_ int __cdecl atoi(_In_z_ const char *_Str)
#define memcpy(s1, s2, n)
#define sprintf(buf, format,...)
void *(__cdecl * malloc_func_t)(MSVCRT_size_t)
void(__cdecl * free_func_t)(void *)
static unsigned __int64 next
#define UNDNAME_NO_COMPLEX_TYPE
malloc_func_t mem_alloc_ptr
static void und_free_all(struct parsed_symbol *sym)
static BOOL demangle_datatype(struct parsed_symbol *sym, struct datatype_t *ct, struct array *pmt, BOOL in_args)
static BOOL get_modified_type(struct datatype_t *ct, struct parsed_symbol *sym, struct array *pmt_ref, char modif, BOOL in_args)
static const char * get_number(struct parsed_symbol *sym)
static char * str_printf(struct parsed_symbol *sym, const char *format,...)
static BOOL get_modifier(struct parsed_symbol *sym, const char **ret, const char **ptr_modif)
static BOOL symbol_demangle(struct parsed_symbol *sym)
static char * get_args(struct parsed_symbol *sym, struct array *pmt_ref, BOOL z_term, char open_char, char close_char)
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_literal_string(struct parsed_symbol *sym)
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 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 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)