20#include "pedigree/kernel/utilities/StaticString.h"
21#include "pedigree/kernel/utilities/demangle.h"
22#include "pedigree/kernel/utilities/utility.h"
34 demangle() : nSubstitutions(0), nTemplateParams(0), nParams(0), nLevel(0), nNameParseLevel(0) {}
36 size_t nSubstitutions;
38 size_t nTemplateParams;
42 size_t nNameParseLevel;
48#define DECLARE(id) static int parse##id(LargeStaticString&, LargeStaticString&, demangle_t&)
49#define DECLARE_LVAL(id) \
50 static int parse##id(LargeStaticString&, LargeStaticString&, demangle_t&, int&)
51#define DECLARE_SVAL(id) \
52 static int parse##id(LargeStaticString&, LargeStaticString&, demangle_t&, LargeStaticString&)
56DECLARE(UnscopedTemplateName);
59DECLARE(UnqualifiedName);
67DECLARE(PointerToMemberType);
68DECLARE(TemplateParam);
69DECLARE(TemplateTemplateParam);
80DECLARE_LVAL(Identifier);
84#define END_SUCCESS(id) \
86 printf("[%d] Success:\t %s, \t%s -> %s\n", data.nLevel--, id, (const char*)src, \
92 printf("[%d] Fail:\t %s, \t%s -> %s\n", data.nLevel--, id, (const char*)src, \
98 printf("[%d] Start:\t %s, \t%s -> %s\n", ++data.nLevel, id, (const char*)src, \
102#define END_SUCCESS(id) return SUCCESS
103#define END_FAIL(id) return FAIL
109 for (
size_t i = 0; i < data.nSubstitutions; i++)
110 if (!StringCompare(data.substitutions[i], str))
115 if (str[0] ==
':' && str[1] ==
':')
118 if (data.nSubstitutions >=
sizeof(data.substitutions) /
sizeof(data.substitutions[0])) {
122 data.substitutions[data.nSubstitutions++] = str;
129 START(
"MangledName");
131 if (src[0] !=
'_' || src[1] !=
'Z')
132 END_FAIL(
"MangledName");
134 if (parseName(src, dest, data) == FAIL)
135 END_FAIL(
"MangledName");
140 if (data.nSubstitutions)
141 data.nSubstitutions--;
146 data.nNameParseLevel = 5;
151 if (data.nTemplateParams > 0)
152 if (parseType(src, tmp, data) == FAIL)
153 END_FAIL(
"MangledName");
157 if (data.nParams >=
sizeof(data.params) /
sizeof(data.params[0])) {
158 END_FAIL(
"MangledName");
160 data.params[data.nParams].clear();
161 if (parseType(src, data.params[data.nParams], data) == FAIL)
162 END_FAIL(
"MangledName");
164 }
while (src.length() > 0);
165 END_SUCCESS(
"MangledName");
176 data.nNameParseLevel++;
182 size_t ret = parseNestedName(src, dest, data);
183 data.nNameParseLevel--;
192 if (parseUnscopedTemplateName(src, dest, data) == SUCCESS &&
193 parseTemplateArgs(src, dest, data) == SUCCESS) {
194 data.nNameParseLevel--;
200 if (parseUnscopedName(src, dest, data) == SUCCESS) {
201 data.nNameParseLevel--;
204 data.nNameParseLevel--;
215 START(
"UnscopedName");
216 if (parseUnqualifiedName(src, dest, data) == SUCCESS)
217 END_SUCCESS(
"UnscopedName");
219 END_FAIL(
"UnscopedName");
228 START(
"UnscopedTemplateName");
233 if (parseSubstitution(src, dest, data) == SUCCESS)
234 END_SUCCESS(
"UnscopedTemplateName");
239 if (parseUnqualifiedName(src, dest, data) == SUCCESS)
240 END_SUCCESS(
"UnscopedTemplateName");
242 END_FAIL(
"UnscopedTemplateName");
255 END_FAIL(
"NestedName");
259 if (src[0] ==
'r' || src[0] ==
'K' || src[0] ==
'V') {
260 if (parseCvQualifiers(src, dest, data) == FAIL)
261 END_FAIL(
"NestedName");
265 if (parsePrefix(src, dest, data, thePrefix) == FAIL)
266 END_FAIL(
"NestedName");
269 END_FAIL(
"NestedName");
272 END_SUCCESS(
"NestedName");
303 if (parseSubstitution(src, dest, data) == SUCCESS)
304 END_SUCCESS(
"Prefix");
311 if (parseUnqualifiedName(src, unqualName, data) == SUCCESS) {
318 thisPrefix += unqualName;
320 addSubstitution(thisPrefix, data);
324 if (parseTemplateArgs(src, unqualName, data) == FAIL) {
329 thisPrefix += unqualName;
330 addSubstitution(thisPrefix, data);
334 if (parsePrefix(src, dest, data, thisPrefix) == SUCCESS)
335 END_SUCCESS(
"Prefix");
344 END_SUCCESS(
"Prefix");
364 START(
"UnqualifiedName");
368 if (parseOperatorName(src, dest, data) == SUCCESS)
369 END_SUCCESS(
"UnqualifiedName");
374 if (parseCtorDtorName(src, dest, data) == SUCCESS)
375 END_SUCCESS(
"UnqualifiedName");
380 if (parseSourceName(src, dest, data) == SUCCESS)
381 END_SUCCESS(
"UnqualifiedName");
383 END_FAIL(
"UnqualifiedName");
391 START(
"CtorDtorName");
392 if (src[0] ==
'C' && (src[1] ==
'0' || src[1] ==
'1' || src[1] ==
'2')) {
395 }
else if (src[0] ==
'D' && (src[1] ==
'0' || src[1] ==
'1' || src[1] ==
'2')) {
399 END_FAIL(
"CtorDtorName");
400 END_SUCCESS(
"CtorDtorName");
456 START(
"OperatorName");
462 dest +=
"operator new";
464 dest +=
"operator new[]";
466 dest +=
"operator delete";
468 dest +=
"operator delete[]";
470 dest +=
"operator+(unary)";
472 dest +=
"operator-(unary)";
474 dest +=
"operator&(unary)";
476 dest +=
"operator*(unary)";
498 dest +=
"operator+=";
500 dest +=
"operator-=";
502 dest +=
"operator*=";
504 dest +=
"operator/=";
506 dest +=
"operator%=";
508 dest +=
"operator&=";
510 dest +=
"operator|=";
512 dest +=
"operator^=";
514 dest +=
"operator<<";
516 dest +=
"operator>>";
518 dest +=
"operator<<=";
520 dest +=
"operator>>=";
522 dest +=
"operator==";
524 dest +=
"operator!=";
530 dest +=
"operator<=";
532 dest +=
"operator>=";
536 dest +=
"operator&&";
538 dest +=
"operator||";
540 dest +=
"operator++";
542 dest +=
"operator--";
546 dest +=
"operator->*";
548 dest +=
"operator->";
550 dest +=
"operator()";
552 dest +=
"operator[]";
556 dest +=
"operator sizeof";
558 dest +=
"operator sizeof";
559 else if (op ==
"cv") {
561 if (parseType(src, dest, data) == FAIL)
562 END_FAIL(
"OperatorName");
564 END_FAIL(
"OperatorName");
566 END_SUCCESS(
"OperatorName");
576 if (parseNumber(src, dest, data, lval) == SUCCESS && lval >= 0 &&
577 parseIdentifier(src, dest, data, lval) == SUCCESS)
578 END_SUCCESS(
"SourceName");
580 END_FAIL(
"SourceName");
591 bool bNegative =
false;
598 if (src[0] <
'0' || src[0] >
'9')
603 while (src[nLength] >=
'0' && src[nLength] <=
'9') {
604 if (nLength ==
sizeof(str) - 1) {
607 str[nLength] = src[nLength];
611 const unsigned long value = StringToUnsignedLong(str, 0, 10);
612 if (value > INT_MAX) {
615 lval =
static_cast<int>(value);
620 src.stripFirst(nLength);
622 END_SUCCESS(
"Number");
631 if (
static_cast<int>(src.length()) < lval)
632 END_FAIL(
"Identifier");
633 for (
int i = 0; i < lval; i++)
635 src.stripFirst(lval);
636 END_SUCCESS(
"Identifier");
643 START(
"CvQualifiers");
644 bool bParsedOne =
false;
661 END_FAIL(
"CvQualifiers");
663 END_SUCCESS(
"CvQualifiers");
683 if (src[0] ==
'r' || src[0] ==
'V' || src[0] ==
'K') {
685 if (parseCvQualifiers(src, tmp, data) == FAIL)
687 if (parseType(src, tmp, data) == FAIL)
690 addSubstitution(tmp, data);
694 else if (src[0] ==
'P') {
697 if (parseType(src, tmp, data) == FAIL)
702 addSubstitution(tmp, data);
706 else if (src[0] ==
'R') {
709 if (parseType(src, tmp, data) == FAIL)
714 addSubstitution(tmp, data);
718 else if (src[0] ==
'F') {
719 if (parseFunctionType(src, dest, data) == FAIL)
724 else if (src[0] ==
'A') {
725 if (parseArrayType(src, dest, data) == FAIL)
730 else if (src[0] ==
'M') {
731 if (parsePointerToMemberType(src, dest, data) == FAIL)
736 else if (src[0] ==
'T') {
740 if (parseTemplateTemplateParam(src, dest, data) == SUCCESS &&
741 parseTemplateArgs(src, dest, data) == SUCCESS)
747 if (parseTemplateParam(src, dest, data) == FAIL)
755 if (parseBuiltinType(src, dest, data) == SUCCESS)
762 if (parseName(src, tmp, data) == SUCCESS) {
764 addSubstitution(tmp, data);
771 if (parseSubstitution(src, dest, data) == FAIL)
804 START(
"BuiltinType");
822 dest +=
"unsigned char";
828 dest +=
"unsigned short";
834 dest +=
"unsigned int";
840 dest +=
"unsigned long";
846 dest +=
"unsigned __int64";
852 dest +=
"unsigned __int128";
864 END_FAIL(
"BuiltinType");
867 END_SUCCESS(
"BuiltinType");
874 START(
"FunctionType");
878 END_FAIL(
"FunctionType");
886 if (parseType(src, dest, data) == FAIL)
887 END_FAIL(
"FunctionType");
890 bool bIsFirst =
true;
896 if (parseType(src, dest, data) == FAIL)
897 END_FAIL(
"FunctionType");
898 }
while (src[0] !=
'E');
902 END_SUCCESS(
"FunctionType");
928 if (src[0] >=
'0' && src[0] <=
'9') {
930 while (src[nLength] >=
'0' && src[nLength] <=
'9')
931 bound += src[nLength++];
932 src.stripFirst(nLength);
933 }
else if (parseExpression(src, bound, data) == FAIL)
943 if (parseType(src, dest, data) == FAIL)
951 END_SUCCESS(
"Array");
959 START(
"PointerToMemberType");
963 END_FAIL(
"PointerToMemberType");
968 if (parseType(src, classType, data) == FAIL)
969 END_FAIL(
"PointerToMemberType");
978 if (parseFunctionType(src, function, data) == FAIL)
979 END_FAIL(
"PointerToMemberType");
982 while (function[nLength] !=
'(' || function[nLength + 1] !=
')')
985 dest += function.left(nLength + 1);
988 dest += function.
right(function.length() - nLength - 1);
990 if (parseType(src, dest, data) == FAIL)
991 END_FAIL(
"PointerToMemberType");
996 END_SUCCESS(
"PointerToMemberType");
1004 START(
"TemplateParam");
1008 END_FAIL(
"TemplateParam");
1013 if (src[0] !=
'_') {
1014 parseNumber(src, dest, data, nId);
1020 END_FAIL(
"TemplateParam");
1025 if (nId < 0 || nId >=
static_cast<int>(data.nTemplateParams)) {
1026 END_FAIL(
"TemplateParam");
1030 dest += data.templateParams[nId];
1031 END_SUCCESS(
"TemplateParam");
1040 START(
"TemplateTemplateParam");
1041 if (parseTemplateParam(src, dest, data) == SUCCESS)
1042 END_SUCCESS(
"TemplateTemplateParam");
1044 END_FAIL(
"TemplateTemplateParam");
1051 START(
"TemplateArgs");
1054 if (data.nNameParseLevel == 1)
1055 data.nTemplateParams = 0;
1058 END_FAIL(
"TemplateArgs");
1061 bool bIsFirst =
true;
1068 if (parseTemplateArg(src, tmp, data) == FAIL)
1069 END_FAIL(
"TemplateArgs");
1071 if (data.nNameParseLevel == 1) {
1072 if (data.nTemplateParams >=
sizeof(data.templateParams) /
sizeof(data.templateParams[0])) {
1073 END_FAIL(
"TemplateArgs");
1075 data.templateParams[data.nTemplateParams] = tmp;
1076 data.nTemplateParams++;
1078 }
while (src[0] !=
'E');
1082 END_SUCCESS(
"TemplateArgs");
1091 START(
"TemplateArg");
1095 if (parseType(src, dest, data) == SUCCESS)
1096 END_SUCCESS(
"TemplateArg");
1101 if (src[0] ==
'X') {
1103 if (parseExpression(src, dest, data) == FAIL)
1104 END_FAIL(
"TemplateArg");
1106 END_FAIL(
"TemplateArg");
1108 END_SUCCESS(
"TemplateArg");
1114 if (parseExprPrimary(src, dest, data) == SUCCESS)
1115 END_SUCCESS(
"TemplateArg");
1117 END_FAIL(
"TemplateArg");
1131 START(
"Expression");
1133 if (src[0] ==
'T') {
1134 if (parseTemplateParam(src, dest, data) == FAIL)
1135 END_FAIL(
"Expression");
1137 END_SUCCESS(
"Expression");
1138 }
else if (src[0] ==
'L') {
1139 if (parseExprPrimary(src, dest, data) == FAIL)
1140 END_FAIL(
"Expression");
1142 END_SUCCESS(
"Expression");
1148#define UNARY_OP(prefix) \
1151 if (parseExpression(src, dest, data) == FAIL) \
1152 END_FAIL("Expression"); \
1154 END_SUCCESS("Expression"); \
1156#define BINARY_OP(infix) \
1159 if (parseExpression(src, dest, data) == FAIL) \
1160 END_FAIL("Expression"); \
1162 if (parseExpression(src, dest, data) == FAIL) \
1163 END_FAIL("Expression"); \
1166 END_SUCCESS("Expression"); \
1171 else if (op == "ng")
1173 else if (op == "ad")
1175 else if (op == "de")
1177 else if (op == "co")
1179 else if (op == "nt")
1181 else if (op == "pl")
1183 else if (op == "mi")
1185 else if (op == "ml")
1187 else if (op == "dv")
1189 else if (op == "rm")
1191 else if (op == "an")
1193 else if (op == "or")
1195 else if (op == "eo")
1197 else if (op == "ls")
1199 else if (op == "rs")
1201 else if (op == "st") {
1203 if (parseType(src, dest, data) == FAIL)
1204 END_FAIL(
"Expression");
1206 END_SUCCESS(
"Expression");
1209 END_FAIL(
"Expression");
1218 START(
"ExprPrimary");
1222 END_FAIL(
"ExprPrimary");
1228 const char* cookie = 0;
1247 if (parseType(src, dest, data) == FAIL)
1248 END_FAIL(
"ExprPrimary");
1254 if (parseNumber(src, dest, data, n) == FAIL)
1255 END_FAIL(
"ExprPrimary");
1256 dest +=
static_cast<ssize_t
>(n);
1259 END_FAIL(
"ExprPrimary");
1263 END_SUCCESS(
"ExprPrimary");
1271 START(
"Substitution");
1275 END_FAIL(
"Substitution");
1280 if (src[0] !=
'_') {
1281 parseSeqId(src, dest, data, nId);
1287 END_FAIL(
"Substitution");
1292 if (nId < 0 || nId >=
static_cast<int>(data.nSubstitutions)) {
1293 END_FAIL(
"Substitution");
1297 dest += data.substitutions[nId];
1299 END_SUCCESS(
"Substitution");
1310 while ((src[nLength] >=
'0' && src[nLength] <=
'9') ||
1311 ((src[nLength] >=
'A') && src[nLength] <=
'Z')) {
1312 if (nLength ==
sizeof(str) - 1) {
1315 str[nLength] = src[nLength];
1318 str[nLength] =
'\0';
1319 const unsigned long value = StringToUnsignedLong(str, 0, 36);
1320 if (value >= INT_MAX) {
1323 lval =
static_cast<int>(value);
1325 src.stripFirst(nLength);
1326 END_SUCCESS(
"SeqId");
1386 data.nSubstitutions = 0;
1387 data.nTemplateParams = 0;
1389 data.nNameParseLevel = 0;
1390 int code = parseMangledName(src, sym->name, data);
1393 if (sym->name[0] ==
':' && sym->name[1] ==
':')
1394 sym->name.stripFirst(2);
1402 sym->nParams = data.nParams;
1403 for (
size_t i = 0; i < data.nParams; i++)
1404 sym->params[i] = data.params[i];
1411 data.nSubstitutions = 0;
1412 data.nTemplateParams = 0;
1413 data.nNameParseLevel = 0;
1416 int code = parseMangledName(src, dest, data);
1419 if (dest[0] ==
':' && dest[1] ==
':')
1428 for (
size_t i = 0; i < data.nParams; i++) {
1432 dest += data.params[i];
StaticString right(int n) const