Go to the documentation of this file.
24 #include "wine/port.h"
31 #include "wine/debug.h"
33 WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
50 typedef void* (*malloc_func_t)(size_t);
58 #define UNDNAME_COMPLETE (0x0000)
59 #define UNDNAME_NO_LEADING_UNDERSCORES (0x0001)
60 #define UNDNAME_NO_MS_KEYWORDS (0x0002)
61 #define UNDNAME_NO_FUNCTION_RETURNS (0x0004)
62 #define UNDNAME_NO_ALLOCATION_MODEL (0x0008)
63 #define UNDNAME_NO_ALLOCATION_LANGUAGE (0x0010)
64 #define UNDNAME_NO_MS_THISTYPE (0x0020)
65 #define UNDNAME_NO_CV_THISTYPE (0x0040)
66 #define UNDNAME_NO_THISTYPE (0x0060)
67 #define UNDNAME_NO_ACCESS_SPECIFIERS (0x0080)
68 #define UNDNAME_NO_THROW_SIGNATURES (0x0100)
69 #define UNDNAME_NO_MEMBER_TYPE (0x0200)
70 #define UNDNAME_NO_RETURN_UDT_MODEL (0x0400)
71 #define UNDNAME_32_BIT_DECODE (0x0800)
72 #define UNDNAME_NAME_ONLY (0x1000)
73 #define UNDNAME_NO_ARGUMENTS (0x2000)
74 #define UNDNAME_NO_SPECIAL_SYMS (0x4000)
75 #define UNDNAME_NO_COMPLEX_TYPE (0x8000)
147 #define BLOCK_SIZE 1024
148 #define AVAIL_SIZE (1024 - sizeof(void*))
154 if (!
ptr)
return NULL;
166 if (!
ptr)
return NULL;
204 a->start =
a->num =
a->max =
a->alloc = 0;
222 new =
und_alloc(sym, (
a->alloc = 32) *
sizeof(
a->elts[0]));
223 if (!
new)
return FALSE;
226 else if (
a->max >=
a->alloc)
228 new =
und_alloc(sym, (
a->alloc * 2) *
sizeof(
a->elts[0]));
229 if (!
new)
return FALSE;
230 memcpy(
new,
a->elts,
a->alloc *
sizeof(
a->elts[0]));
236 assert(
a->elts[
a->num]);
238 a->elts[
a->num][
len] =
'\0';
239 if (++
a->num >=
a->max)
a->max =
a->num;
244 for (
i =
a->max - 1;
i >= 0;
i--)
247 if (i < a->
start)
c =
'-';
248 else if (
i >=
a->num)
c =
'}';
266 WARN(
"Out of bounds: %p %d + %d >= %d\n",
270 TRACE(
"Returning %p[%d] => %s\n",
283 unsigned int len = 1,
i, sz;
295 case 's': t = va_arg(
args,
char*);
if (t)
len += strlen(t);
break;
296 case 'c': (void)va_arg(
args,
int);
len++;
break;
298 case '%':
len++;
break;
313 t = va_arg(
args,
char*);
322 *
p++ = (char)va_arg(
args,
int);
325 case '%': *
p++ =
'%';
break;
352 if (sgn)
ptr[0] =
'-';
354 ptr[sgn ? 2 : 1] =
'\0';
360 if (sgn)
ptr[0] =
'-';
361 ptr[sgn ? 1 : 0] =
'1';
362 ptr[sgn ? 2 : 1] =
'0';
363 ptr[sgn ? 3 : 2] =
'\0';
375 if (*sym->
current !=
'@')
return NULL;
378 sprintf(
ptr,
"%s%u", sgn ?
"-" :
"",
ret);
391 char open_char,
char close_char)
395 struct array arg_collect;
396 char* args_str = NULL;
414 if (z_term && !strcmp(ct.
left,
"void"))
break;
418 if (!strcmp(ct.
left,
"..."))
break;
423 if (z_term && *sym->
current++ !=
'Z')
return NULL;
425 if (arg_collect.
num == 0 ||
426 (arg_collect.
num == 1 && !strcmp(arg_collect.
elts[0],
"void")))
427 return str_printf(sym,
"%cvoid%c", open_char, close_char);
428 for (
i = 1;
i < arg_collect.
num;
i++)
433 last = args_str ? args_str : arg_collect.
elts[0];
434 if (close_char ==
'>' && last[strlen(last) - 1] ==
'>')
436 open_char, arg_collect.
elts[0], args_str, close_char);
439 open_char, arg_collect.
elts[0], args_str, close_char);
455 *ptr_modif =
"__ptr64";
457 *ptr_modif = *ptr_modif + 2;
463 case 'A': *
ret = NULL;
break;
464 case 'B': *
ret =
"const";
break;
465 case 'C': *
ret =
"volatile";
break;
466 case 'D': *
ret =
"const volatile";
break;
467 default:
return FALSE;
473 struct array *pmt_ref,
char modif,
BOOL in_args)
475 const char* modifier;
476 const char* str_modif;
477 const char *ptr_modif =
"";
484 ptr_modif =
" ptr64";
486 ptr_modif =
" __ptr64";
493 case 'A': str_modif =
str_printf(sym,
" &%s", ptr_modif);
break;
494 case 'B': str_modif =
str_printf(sym,
" &%s volatile", ptr_modif);
break;
495 case 'P': str_modif =
str_printf(sym,
" *%s", ptr_modif);
break;
496 case 'Q': str_modif =
str_printf(sym,
" *%s const", ptr_modif);
break;
497 case 'R': str_modif =
str_printf(sym,
" *%s volatile", ptr_modif);
break;
498 case 'S': str_modif =
str_printf(sym,
" *%s const volatile", ptr_modif);
break;
499 case '?': str_modif =
"";
break;
500 default:
return FALSE;
518 if (str_modif[0] ==
' ' && !modifier)
523 str_modif =
str_printf(sym,
" (%s%s)", modifier, str_modif);
527 str_modif =
str_printf(sym,
" (%s)", str_modif);
541 if (!in_args && str_modif[0] && str_modif[1] ==
'*' && sub_ct.
left[strlen(sub_ct.
left)-1] ==
'*')
570 }
while (*++sym->
current !=
'@');
593 unsigned stack_mark = sym->
stack.
num;
594 struct array array_pmt;
626 const char*
name = NULL;
632 case '\0':
return FALSE;
634 case '0':
case '1':
case '2':
case '3':
635 case '4':
case '5':
case '6':
case '7':
686 unsigned int len, sz;
693 len += 2 + strlen(
a->elts[
i]);
698 sz = strlen(
a->elts[
i]);
732 const char** exported,
unsigned flags)
734 *call_conv = *exported = NULL;
740 if (((
ch -
'A') % 2) == 1) *exported =
"dll_export ";
743 case 'A':
case 'B': *call_conv =
"cdecl";
break;
744 case 'C':
case 'D': *call_conv =
"pascal";
break;
745 case 'E':
case 'F': *call_conv =
"thiscall";
break;
746 case 'G':
case 'H': *call_conv =
"stdcall";
break;
747 case 'I':
case 'J': *call_conv =
"fastcall";
break;
748 case 'K':
case 'L':
break;
749 case 'M': *call_conv =
"clrcall";
break;
750 default:
ERR(
"Unknown calling convention %c\n",
ch);
return FALSE;
755 if (((
ch -
'A') % 2) == 1) *exported =
"__dll_export ";
758 case 'A':
case 'B': *call_conv =
"__cdecl";
break;
759 case 'C':
case 'D': *call_conv =
"__pascal";
break;
760 case 'E':
case 'F': *call_conv =
"__thiscall";
break;
761 case 'G':
case 'H': *call_conv =
"__stdcall";
break;
762 case 'I':
case 'J': *call_conv =
"__fastcall";
break;
763 case 'K':
case 'L':
break;
764 case 'M': *call_conv =
"__clrcall";
break;
765 default:
ERR(
"Unknown calling convention %c\n",
ch);
return FALSE;
778 const char* type_string;
782 case 'C': type_string =
"signed char";
break;
783 case 'D': type_string =
"char";
break;
784 case 'E': type_string =
"unsigned char";
break;
785 case 'F': type_string =
"short";
break;
786 case 'G': type_string =
"unsigned short";
break;
787 case 'H': type_string =
"int";
break;
788 case 'I': type_string =
"unsigned int";
break;
789 case 'J': type_string =
"long";
break;
790 case 'K': type_string =
"unsigned long";
break;
791 case 'M': type_string =
"float";
break;
792 case 'N': type_string =
"double";
break;
793 case 'O': type_string =
"long double";
break;
794 case 'X': type_string =
"void";
break;
795 case 'Z': type_string =
"...";
break;
796 default: type_string = NULL;
break;
807 const char* type_string;
811 case 'D': type_string =
"__int8";
break;
812 case 'E': type_string =
"unsigned __int8";
break;
813 case 'F': type_string =
"__int16";
break;
814 case 'G': type_string =
"unsigned __int16";
break;
815 case 'H': type_string =
"__int32";
break;
816 case 'I': type_string =
"unsigned __int32";
break;
817 case 'J': type_string =
"__int64";
break;
818 case 'K': type_string =
"unsigned __int64";
break;
819 case 'L': type_string =
"__int128";
break;
820 case 'M': type_string =
"unsigned __int128";
break;
821 case 'N': type_string =
"bool";
break;
822 case 'W': type_string =
"wchar_t";
break;
823 default: type_string = NULL;
break;
850 case 'C':
case 'D':
case 'E':
case 'F':
case 'G':
851 case 'H':
case 'I':
case 'J':
case 'K':
case 'M':
852 case 'N':
case 'O':
case 'X':
case 'Z':
863 const char* struct_name = NULL;
875 case 'Y':
type_name =
"cointerface ";
break;
910 const char* call_conv;
911 const char* exported;
916 &call_conv, &exported,
941 ct->
left = enum_name;
947 case '0':
case '1':
case '2':
case '3':
case '4':
948 case '5':
case '6':
case '7':
case '8':
case '9':
999 const char *
ptr, *ptr_modif;
1010 ERR(
"Unknown type %c\n", dt);
1013 if (add_pmt && pmt_ref && in_args)
1022 return ct->
left != NULL;
1032 const char*
access = NULL;
1033 const char* member_type = NULL;
1034 const char* modifier = NULL;
1035 const char* ptr_modif;
1055 case '0':
access =
"private: ";
break;
1056 case '1':
access =
"protected: ";
break;
1057 case '2':
access =
"public: ";
break;
1064 member_type =
"static ";
1071 case '0':
case '1':
case '2':
1072 case '3':
case '4':
case '5':
1081 if (modifier && ptr_modif) modifier =
str_printf(sym,
"%s %s", modifier, ptr_modif);
1082 else if (!modifier) modifier = ptr_modif;
1108 member_type, ct.
left,
1109 modifier && ct.
left ?
" " : NULL, modifier,
1124 const char*
access = NULL;
1126 const char* member_type = NULL;
1128 const char* call_conv;
1129 const char* modifier = NULL;
1130 const char* exported;
1131 const char* args_str = NULL;
1132 const char*
name = NULL;
1135 struct array array_pmt;
1177 access_id = (*sym->
current -
'0') / 2;
1178 else if (*sym->
current ==
'R')
1179 access_id = (sym->
current[1] -
'0') / 2;
1180 else if (*sym->
current !=
'B')
1183 else if (accmem >=
'A' && accmem <=
'Z')
1184 access_id = (accmem -
'A') / 8;
1190 case 0:
access =
"private: ";
break;
1191 case 1:
access =
"protected: ";
break;
1192 case 2:
access =
"public: ";
break;
1194 if (accmem ==
'$' || (accmem -
'A') % 8 == 6 || (accmem -
'A') % 8 == 7)
1197 if (accmem ==
'$' && *sym->
current !=
'B')
1198 member_type =
"virtual ";
1199 else if (accmem <=
'X')
1201 switch ((accmem -
'A') % 8)
1203 case 2:
case 3: member_type =
"static ";
break;
1204 case 4:
case 5:
case 6:
case 7: member_type =
"virtual ";
break;
1215 if (accmem ==
'$' && *sym->
current ==
'B')
1227 else if (accmem ==
'$' && *sym->
current ==
'R')
1229 const char *n1, *n2, *n3, *n4;
1237 if(!n1 || !n2 || !n3 || !n4)
goto done;
1240 else if (accmem ==
'$')
1242 const char *n1, *n2;
1248 if (!n1 || !n2)
goto done;
1251 else if ((accmem -
'A') % 8 == 6 || (accmem -
'A') % 8 == 7)
1254 if (has_args && (accmem ==
'$' ||
1255 (accmem <=
'X' && (accmem -
'A') % 8 != 2 && (accmem -
'A') % 8 != 3)))
1257 const char *ptr_modif;
1261 if (modifier || ptr_modif) modifier =
str_printf(sym,
"%s %s", modifier, ptr_modif);
1271 if (has_ret && *sym->
current ==
'@')
1273 ct_ret.
left =
"void";
1274 ct_ret.
right = NULL;
1291 if (has_args && !(args_str =
get_args(sym, &array_pmt,
TRUE,
'(',
')')))
goto done;
1301 (ct_ret.
left && !ct_ret.
right) ?
" " : NULL,
1302 call_conv, call_conv ?
" " : NULL, exported,
1303 name, args_str, modifier, ct_ret.
right);
1316 unsigned do_after = 0;
1317 static CHAR dashed_null[] =
"--null--";
1339 const char* function_name = NULL;
1350 case '0': do_after = 1;
break;
1351 case '1': do_after = 2;
break;
1352 case '2': function_name =
"operator new";
break;
1353 case '3': function_name =
"operator delete";
break;
1354 case '4': function_name =
"operator=";
break;
1355 case '5': function_name =
"operator>>";
break;
1356 case '6': function_name =
"operator<<";
break;
1357 case '7': function_name =
"operator!";
break;
1358 case '8': function_name =
"operator==";
break;
1359 case '9': function_name =
"operator!=";
break;
1360 case 'A': function_name =
"operator[]";
break;
1361 case 'B': function_name =
"operator "; do_after = 3;
break;
1362 case 'C': function_name =
"operator->";
break;
1363 case 'D': function_name =
"operator*";
break;
1364 case 'E': function_name =
"operator++";
break;
1365 case 'F': function_name =
"operator--";
break;
1366 case 'G': function_name =
"operator-";
break;
1367 case 'H': function_name =
"operator+";
break;
1368 case 'I': function_name =
"operator&";
break;
1369 case 'J': function_name =
"operator->*";
break;
1370 case 'K': function_name =
"operator/";
break;
1371 case 'L': function_name =
"operator%";
break;
1372 case 'M': function_name =
"operator<";
break;
1373 case 'N': function_name =
"operator<=";
break;
1374 case 'O': function_name =
"operator>";
break;
1375 case 'P': function_name =
"operator>=";
break;
1376 case 'Q': function_name =
"operator,";
break;
1377 case 'R': function_name =
"operator()";
break;
1378 case 'S': function_name =
"operator~";
break;
1379 case 'T': function_name =
"operator^";
break;
1380 case 'U': function_name =
"operator|";
break;
1381 case 'V': function_name =
"operator&&";
break;
1382 case 'W': function_name =
"operator||";
break;
1383 case 'X': function_name =
"operator*=";
break;
1384 case 'Y': function_name =
"operator+=";
break;
1385 case 'Z': function_name =
"operator-=";
break;
1389 case '0': function_name =
"operator/=";
break;
1390 case '1': function_name =
"operator%=";
break;
1391 case '2': function_name =
"operator>>=";
break;
1392 case '3': function_name =
"operator<<=";
break;
1393 case '4': function_name =
"operator&=";
break;
1394 case '5': function_name =
"operator|=";
break;
1395 case '6': function_name =
"operator^=";
break;
1396 case '7': function_name =
"`vftable'";
break;
1397 case '8': function_name =
"`vbtable'";
break;
1398 case '9': function_name =
"`vcall'";
break;
1399 case 'A': function_name =
"`typeof'";
break;
1400 case 'B': function_name =
"`local static guard'";
break;
1401 case 'C': function_name =
"`string'"; do_after = 4;
break;
1402 case 'D': function_name =
"`vbase destructor'";
break;
1403 case 'E': function_name =
"`vector deleting destructor'";
break;
1404 case 'F': function_name =
"`default constructor closure'";
break;
1405 case 'G': function_name =
"`scalar deleting destructor'";
break;
1406 case 'H': function_name =
"`vector constructor iterator'";
break;
1407 case 'I': function_name =
"`vector destructor iterator'";
break;
1408 case 'J': function_name =
"`vector vbase constructor iterator'";
break;
1409 case 'K': function_name =
"`virtual displacement map'";
break;
1410 case 'L': function_name =
"`eh vector constructor iterator'";
break;
1411 case 'M': function_name =
"`eh vector destructor iterator'";
break;
1412 case 'N': function_name =
"`eh vector vbase constructor iterator'";
break;
1413 case 'O': function_name =
"`copy constructor closure'";
break;
1426 function_name =
str_printf(sym,
"%s%s `RTTI Type Descriptor'",
1433 const char* n1, *n2, *n3, *n4;
1440 function_name =
str_printf(sym,
"`RTTI Base Class Descriptor at (%s,%s,%s,%s)'",
1444 case '2': function_name =
"`RTTI Base Class Array'";
break;
1445 case '3': function_name =
"`RTTI Class Hierarchy Descriptor'";
break;
1446 case '4': function_name =
"`RTTI Complete Object Locator'";
break;
1448 ERR(
"Unknown RTTI operator: _R%c\n", *sym->
current);
1452 case 'S': function_name =
"`local vftable'";
break;
1453 case 'T': function_name =
"`local vftable constructor closure'";
break;
1454 case 'U': function_name =
"operator new[]";
break;
1455 case 'V': function_name =
"operator delete[]";
break;
1456 case 'X': function_name =
"`placement delete closure'";
break;
1457 case 'Y': function_name =
"`placement delete[] closure'";
break;
1459 ERR(
"Unknown operator: _%c\n", *sym->
current);
1465 ERR(
"Unknown operator: %c\n", *sym->
current);
1476 sym->
result = (
char*)function_name;
1482 struct array array_pmt;
1496 else if (*sym->
current ==
'$')
1510 case '@': sym->
current++;
break;
1520 case 0:
default:
break;
1572 void* unknown,
unsigned short int flags)
1577 TRACE(
"(%p,%s,%d,%p,%p,%p,%x)\n",
1578 buffer, mangled, buflen, memget, memfree, unknown,
flags);
1598 #ifndef UPSTREAM_CODE
1610 #ifndef UPSTREAM_CODE
1625 unsigned short int flags)
static const char * get_simple_type(char c)
static char * str_printf(struct parsed_symbol *sym, const char *format,...)
return memset(p, 0, total)
static BOOL get_modified_type(struct datatype_t *ct, struct parsed_symbol *sym, struct array *pmt_ref, char modif, BOOL in_args)
#define UNDNAME_NO_ACCESS_SPECIFIERS
static char * str_array_get_ref(struct array *cref, unsigned idx)
static void und_free_all(struct parsed_symbol *sym)
#define UNDNAME_NO_COMPLEX_TYPE
#define UNDNAME_NO_ARGUMENTS
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
#define UNDNAME_NO_LEADING_UNDERSCORES
static BOOL get_class(struct parsed_symbol *sym)
static const char * get_extended_type(char c)
static BOOL get_calling_convention(char ch, const char **call_conv, const char **exported, unsigned flags)
void(* free_func_t)(void *)
static char * get_args(struct parsed_symbol *sym, struct array *pmt_ref, BOOL z_term, char open_char, char close_char)
#define UNDNAME_NO_MEMBER_TYPE
char * lstrcpynA(char *out, const char *in, int n)
void *(* malloc_func_t)(size_t)
static char * get_literal_string(struct parsed_symbol *sym)
static void str_array_init(struct array *a)
#define UNDNAME_NO_ALLOCATION_LANGUAGE
static char * get_class_name(struct parsed_symbol *sym)
static BOOL str_array_push(struct parsed_symbol *sym, const char *ptr, int len, struct array *a)
static BOOL get_modifier(struct parsed_symbol *sym, const char **ret, const char **ptr_modif)
static BOOL handle_method(struct parsed_symbol *sym, BOOL cast_op)
static BOOL symbol_demangle(struct parsed_symbol *sym)
#define UNDNAME_NAME_ONLY
static BOOL demangle_datatype(struct parsed_symbol *sym, struct datatype_t *ct, struct array *pmt, BOOL in_args)
char *CDECL __unDName(char *buffer, const char *mangled, int buflen, malloc_func_t memget, free_func_t memfree, unsigned short int flags)
static char * get_class_string(struct parsed_symbol *sym, int start)
UniquePtr< SSL_SESSION > ret
AllocList * next[kMaxLevel]
static void * und_alloc(struct parsed_symbol *sym, unsigned int len)
#define UNDNAME_NO_THISTYPE
static const char * get_number(struct parsed_symbol *sym)
char *CDECL __unDNameEx(char *buffer, const char *mangled, int buflen, malloc_func_t memget, free_func_t memfree, void *unknown, unsigned short int flags)
malloc_func_t mem_alloc_ptr
#define UNDNAME_NO_MS_KEYWORDS
static char * get_template_name(struct parsed_symbol *sym)
#define UNDNAME_NO_FUNCTION_RETURNS
static const char * type_name(int type)
static BOOL handle_data(struct parsed_symbol *sym)
grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:43