103#define BLOCK_SIZE 1024
104#define AVAIL_SIZE (1024 - sizeof(void*))
160 a->start =
a->num =
a->max =
a->alloc = 0;
178 new =
und_alloc(sym, (
a->alloc = 32) *
sizeof(
a->elts[0]));
179 if (!
new)
return FALSE;
182 else if (
a->max >=
a->alloc)
184 new =
und_alloc(sym, (
a->alloc * 2) *
sizeof(
a->elts[0]));
185 if (!
new)
return FALSE;
186 memcpy(
new,
a->elts,
a->alloc *
sizeof(
a->elts[0]));
194 a->elts[
a->num][
len] =
'\0';
195 if (++
a->num >=
a->max)
a->max =
a->num;
200 for (
i =
a->max - 1;
i >= 0;
i--)
203 if (i < a->
start)
c =
'-';
204 else if (
i >=
a->num)
c =
'}';
222 WARN(
"Out of bounds: %p %d + %d >= %d\n",
226 TRACE(
"Returning %p[%d] => %s\n",
239 unsigned int len = 1,
i, sz;
254 case '%':
len++;
break;
281 case '%': *
p++ =
'%';
break;
351 struct array arg_collect;
352 char* args_str =
NULL;
370 if (z_term && !
strcmp(ct.
left,
"void"))
break;
381 if (arg_collect.
num == 0 ||
382 (arg_collect.
num == 1 && !
strcmp(arg_collect.
elts[0],
"void")))
384 for (
i = 1;
i < arg_collect.
num;
i++)
389 last = args_str ? args_str : arg_collect.
elts[0];
411 *ptr_modif =
"__ptr64";
413 *ptr_modif = *ptr_modif + 2;
420 case 'B': *
ret =
"const";
break;
421 case 'C': *
ret =
"volatile";
break;
422 case 'D': *
ret =
"const volatile";
break;
423 default:
return FALSE;
429 struct array *pmt_ref,
char modif,
BOOL in_args)
431 const char* modifier;
432 const char* str_modif;
433 const char *ptr_modif =
"";
440 ptr_modif =
" ptr64";
442 ptr_modif =
" __ptr64";
449 case 'A': str_modif =
str_printf(sym,
" &%s", ptr_modif);
break;
450 case 'B': str_modif =
str_printf(sym,
" &%s volatile", ptr_modif);
break;
451 case 'P': str_modif =
str_printf(sym,
" *%s", ptr_modif);
break;
452 case 'Q': str_modif =
str_printf(sym,
" *%s const", ptr_modif);
break;
453 case 'R': str_modif =
str_printf(sym,
" *%s volatile", ptr_modif);
break;
454 case 'S': str_modif =
str_printf(sym,
" *%s const volatile", ptr_modif);
break;
455 case '?': str_modif =
"";
break;
456 default:
return FALSE;
461 unsigned mark = sym->
stack.num;
474 if (str_modif[0] ==
' ' && !modifier)
479 str_modif =
str_printf(sym,
" (%s%s)", modifier, str_modif);
483 str_modif =
str_printf(sym,
" (%s)", str_modif);
497 if (!in_args && str_modif[0] && str_modif[1] ==
'*' && sub_ct.
left[
strlen(sub_ct.
left)-1] ==
'*')
502 sym->
stack.num = mark;
526 }
while (*++sym->
current !=
'@');
547 unsigned num_mark = sym->
names.num;
548 unsigned start_mark = sym->
names.start;
549 unsigned stack_mark = sym->
stack.num;
550 struct array array_pmt;
554 sym->
names.start = start_mark;
561 sym->
names.num = num_mark;
562 sym->
names.start = start_mark;
563 sym->
stack.num = stack_mark;
588 case '\0':
return FALSE;
590 case '0':
case '1':
case '2':
case '3':
591 case '4':
case '5':
case '6':
case '7':
642 unsigned int len, sz;
673 unsigned mark = sym->
stack.num;
678 sym->
stack.num = mark;
688 const char** exported,
unsigned flags)
690 *call_conv = *exported =
NULL;
696 if (((ch -
'A') % 2) == 1) *exported =
"dll_export ";
699 case 'A':
case 'B': *call_conv =
"cdecl";
break;
700 case 'C':
case 'D': *call_conv =
"pascal";
break;
701 case 'E':
case 'F': *call_conv =
"thiscall";
break;
702 case 'G':
case 'H': *call_conv =
"stdcall";
break;
703 case 'I':
case 'J': *call_conv =
"fastcall";
break;
704 case 'K':
case 'L':
break;
705 case 'M': *call_conv =
"clrcall";
break;
706 default:
ERR(
"Unknown calling convention %c\n", ch);
return FALSE;
711 if (((ch -
'A') % 2) == 1) *exported =
"__dll_export ";
714 case 'A':
case 'B': *call_conv =
"__cdecl";
break;
715 case 'C':
case 'D': *call_conv =
"__pascal";
break;
716 case 'E':
case 'F': *call_conv =
"__thiscall";
break;
717 case 'G':
case 'H': *call_conv =
"__stdcall";
break;
718 case 'I':
case 'J': *call_conv =
"__fastcall";
break;
719 case 'K':
case 'L':
break;
720 case 'M': *call_conv =
"__clrcall";
break;
721 default:
ERR(
"Unknown calling convention %c\n", ch);
return FALSE;
734 const char* type_string;
738 case 'C': type_string =
"signed char";
break;
739 case 'D': type_string =
"char";
break;
740 case 'E': type_string =
"unsigned char";
break;
741 case 'F': type_string =
"short";
break;
742 case 'G': type_string =
"unsigned short";
break;
743 case 'H': type_string =
"int";
break;
744 case 'I': type_string =
"unsigned int";
break;
745 case 'J': type_string =
"long";
break;
746 case 'K': type_string =
"unsigned long";
break;
747 case 'M': type_string =
"float";
break;
748 case 'N': type_string =
"double";
break;
749 case 'O': type_string =
"long double";
break;
750 case 'X': type_string =
"void";
break;
751 case 'Z': type_string =
"...";
break;
752 default: type_string =
NULL;
break;
763 const char* type_string;
767 case 'D': type_string =
"__int8";
break;
768 case 'E': type_string =
"unsigned __int8";
break;
769 case 'F': type_string =
"__int16";
break;
770 case 'G': type_string =
"unsigned __int16";
break;
771 case 'H': type_string =
"__int32";
break;
772 case 'I': type_string =
"unsigned __int32";
break;
773 case 'J': type_string =
"__int64";
break;
774 case 'K': type_string =
"unsigned __int64";
break;
775 case 'L': type_string =
"__int128";
break;
776 case 'M': type_string =
"unsigned __int128";
break;
777 case 'N': type_string =
"bool";
break;
778 case 'W': type_string =
"wchar_t";
break;
779 default: type_string =
NULL;
break;
806 case 'C':
case 'D':
case 'E':
case 'F':
case 'G':
807 case 'H':
case 'I':
case 'J':
case 'K':
case 'M':
808 case 'N':
case 'O':
case 'X':
case 'Z':
819 const char* struct_name =
NULL;
820 const char* type_name =
NULL;
828 case 'T': type_name =
"union ";
break;
829 case 'U': type_name =
"struct ";
break;
830 case 'V': type_name =
"class ";
break;
831 case 'Y': type_name =
"cointerface ";
break;
857 if (!
get_modified_type(ct, sym, pmt_ref, in_args ? dt :
'P', in_args))
goto done;
869 const char* call_conv;
870 const char* exported;
872 unsigned mark = sym->
stack.num;
874 const char* modifier;
875 const char* ptr_modif;
884 modifier =
str_printf(sym,
"%s %s", modifier, ptr_modif);
885 else if(ptr_modif[0])
888 &call_conv, &exported,
895 if (!
args)
goto done;
896 sym->
stack.num = mark;
899 sub_ct.
left, sub_ct.
right, call_conv,
class);
905 const char* call_conv;
906 const char* exported;
908 unsigned mark = sym->
stack.num;
913 &call_conv, &exported,
919 if (!
args)
goto done;
920 sym->
stack.num = mark;
938 ct->
left = enum_name;
944 case '0':
case '1':
case '2':
case '3':
case '4':
945 case '5':
case '6':
case '7':
case '8':
case '9':
948 if (!pmt_ref)
goto done;
951 if (!ct->
left)
goto done;
997 unsigned mark = sym->
stack.num;
999 const char* arr =
NULL;
1023 sym->
stack.num = mark;
1025 else if (*sym->
current ==
'C')
1027 const char *
ptr, *ptr_modif;
1038 ERR(
"Unknown type %c\n", dt);
1041 if (add_pmt && pmt_ref && in_args)
1061 const char* member_type =
NULL;
1062 const char* modifier =
NULL;
1063 const char* ptr_modif;
1083 case '0':
access =
"private: ";
break;
1084 case '1':
access =
"protected: ";
break;
1085 case '2':
access =
"public: ";
break;
1092 member_type =
"static ";
1099 case '0':
case '1':
case '2':
1100 case '3':
case '4':
case '5':
1102 unsigned mark = sym->
stack.num;
1108 if (!
get_modifier(sym, &modifier, &ptr_modif))
goto done;
1109 if (modifier && ptr_modif) modifier =
str_printf(sym,
"%s %s", modifier, ptr_modif);
1110 else if (!modifier) modifier = ptr_modif;
1111 sym->
stack.num = mark;
1117 if (!
get_modifier(sym, &modifier, &ptr_modif))
goto done;
1136 member_type, ct.
left,
1137 modifier && ct.
left ?
" " :
NULL, modifier,
1154 const char* member_type =
NULL;
1156 const char* call_conv;
1157 const char* modifier =
NULL;
1158 const char* exported;
1159 const char* args_str =
NULL;
1163 struct array array_pmt;
1205 access_id = (*sym->
current -
'0') / 2;
1206 else if (*sym->
current ==
'R')
1207 access_id = (sym->
current[1] -
'0') / 2;
1208 else if (*sym->
current !=
'B')
1211 else if (accmem >=
'A' && accmem <=
'Z')
1212 access_id = (accmem -
'A') / 8;
1218 case 0:
access =
"private: ";
break;
1219 case 1:
access =
"protected: ";
break;
1220 case 2:
access =
"public: ";
break;
1222 if (accmem ==
'$' || (accmem -
'A') % 8 == 6 || (accmem -
'A') % 8 == 7)
1225 if (accmem ==
'$' && *sym->
current !=
'B')
1226 member_type =
"virtual ";
1227 else if (accmem <=
'X')
1229 switch ((accmem -
'A') % 8)
1231 case 2:
case 3: member_type =
"static ";
break;
1232 case 4:
case 5:
case 6:
case 7: member_type =
"virtual ";
break;
1243 if (accmem ==
'$' && *sym->
current ==
'B')
1250 if(!
n || *sym->
current++ !=
'A')
goto done;
1255 else if (accmem ==
'$' && *sym->
current ==
'R')
1265 if(!
n1 || !
n2 || !
n3 || !
n4)
goto done;
1268 else if (accmem ==
'$')
1270 const char *
n1, *
n2;
1276 if (!
n1 || !
n2)
goto done;
1279 else if ((accmem -
'A') % 8 == 6 || (accmem -
'A') % 8 == 7)
1282 if (has_args && (accmem ==
'$' ||
1283 (accmem <=
'X' && (accmem -
'A') % 8 != 2 && (accmem -
'A') % 8 != 3)))
1285 const char *ptr_modif;
1288 if (!
get_modifier(sym, &modifier, &ptr_modif))
goto done;
1289 if (modifier || ptr_modif) modifier =
str_printf(sym,
"%s %s", modifier, ptr_modif);
1299 if (has_ret && *sym->
current ==
'@')
1301 ct_ret.
left =
"void";
1318 mark = sym->
stack.num;
1319 if (has_args && !(args_str =
get_args(sym, &array_pmt,
TRUE,
'(',
')')))
goto done;
1322 sym->
stack.num = mark;
1330 call_conv, call_conv ?
" " :
NULL, exported,
1331 name, args_str, modifier, ct_ret.
right);
1344 unsigned do_after = 0;
1345 static CHAR dashed_null[] =
"--null--";
1367 const char* function_name =
NULL;
1378 case '0': do_after = 1;
break;
1379 case '1': do_after = 2;
break;
1380 case '2': function_name =
"operator new";
break;
1381 case '3': function_name =
"operator delete";
break;
1382 case '4': function_name =
"operator=";
break;
1383 case '5': function_name =
"operator>>";
break;
1384 case '6': function_name =
"operator<<";
break;
1385 case '7': function_name =
"operator!";
break;
1386 case '8': function_name =
"operator==";
break;
1387 case '9': function_name =
"operator!=";
break;
1388 case 'A': function_name =
"operator[]";
break;
1389 case 'B': function_name =
"operator "; do_after = 3;
break;
1390 case 'C': function_name =
"operator->";
break;
1391 case 'D': function_name =
"operator*";
break;
1392 case 'E': function_name =
"operator++";
break;
1393 case 'F': function_name =
"operator--";
break;
1394 case 'G': function_name =
"operator-";
break;
1395 case 'H': function_name =
"operator+";
break;
1396 case 'I': function_name =
"operator&";
break;
1397 case 'J': function_name =
"operator->*";
break;
1398 case 'K': function_name =
"operator/";
break;
1399 case 'L': function_name =
"operator%";
break;
1400 case 'M': function_name =
"operator<";
break;
1401 case 'N': function_name =
"operator<=";
break;
1402 case 'O': function_name =
"operator>";
break;
1403 case 'P': function_name =
"operator>=";
break;
1404 case 'Q': function_name =
"operator,";
break;
1405 case 'R': function_name =
"operator()";
break;
1406 case 'S': function_name =
"operator~";
break;
1407 case 'T': function_name =
"operator^";
break;
1408 case 'U': function_name =
"operator|";
break;
1409 case 'V': function_name =
"operator&&";
break;
1410 case 'W': function_name =
"operator||";
break;
1411 case 'X': function_name =
"operator*=";
break;
1412 case 'Y': function_name =
"operator+=";
break;
1413 case 'Z': function_name =
"operator-=";
break;
1417 case '0': function_name =
"operator/=";
break;
1418 case '1': function_name =
"operator%=";
break;
1419 case '2': function_name =
"operator>>=";
break;
1420 case '3': function_name =
"operator<<=";
break;
1421 case '4': function_name =
"operator&=";
break;
1422 case '5': function_name =
"operator|=";
break;
1423 case '6': function_name =
"operator^=";
break;
1424 case '7': function_name =
"`vftable'";
break;
1425 case '8': function_name =
"`vbtable'";
break;
1426 case '9': function_name =
"`vcall'";
break;
1427 case 'A': function_name =
"`typeof'";
break;
1428 case 'B': function_name =
"`local static guard'";
break;
1429 case 'C': function_name =
"`string'"; do_after = 4;
break;
1430 case 'D': function_name =
"`vbase destructor'";
break;
1431 case 'E': function_name =
"`vector deleting destructor'";
break;
1432 case 'F': function_name =
"`default constructor closure'";
break;
1433 case 'G': function_name =
"`scalar deleting destructor'";
break;
1434 case 'H': function_name =
"`vector constructor iterator'";
break;
1435 case 'I': function_name =
"`vector destructor iterator'";
break;
1436 case 'J': function_name =
"`vector vbase constructor iterator'";
break;
1437 case 'K': function_name =
"`virtual displacement map'";
break;
1438 case 'L': function_name =
"`eh vector constructor iterator'";
break;
1439 case 'M': function_name =
"`eh vector destructor iterator'";
break;
1440 case 'N': function_name =
"`eh vector vbase constructor iterator'";
break;
1441 case 'O': function_name =
"`copy constructor closure'";
break;
1456 function_name =
str_printf(sym,
"%s%s `RTTI Type Descriptor'",
1470 function_name =
str_printf(sym,
"`RTTI Base Class Descriptor at (%s,%s,%s,%s)'",
1474 case '2': function_name =
"`RTTI Base Class Array'";
break;
1475 case '3': function_name =
"`RTTI Class Hierarchy Descriptor'";
break;
1476 case '4': function_name =
"`RTTI Complete Object Locator'";
break;
1478 ERR(
"Unknown RTTI operator: _R%c\n", *sym->
current);
1482 case 'S': function_name =
"`local vftable'";
break;
1483 case 'T': function_name =
"`local vftable constructor closure'";
break;
1484 case 'U': function_name =
"operator new[]";
break;
1485 case 'V': function_name =
"operator delete[]";
break;
1486 case 'X': function_name =
"`placement delete closure'";
break;
1487 case 'Y': function_name =
"`placement delete[] closure'";
break;
1489 ERR(
"Unknown operator: _%c\n", *sym->
current);
1495 ERR(
"Unknown operator: %c\n", *sym->
current);
1506 sym->
result = (
char*)function_name;
1512 struct array array_pmt;
1526 else if (*sym->
current ==
'$')
1540 case '@': sym->
current++;
break;
1550 case 0:
default:
break;
1553 if (sym->
stack.num <= 1)
goto done;
1562 sym->
flags &= ~UNDNAME_NO_FUNCTION_RETURNS;
1607 TRACE(
"(%p,%s,%d,%p,%p,%p,%x)\n",
1649 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
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)