20#include "pedigree/kernel/utilities/StaticString.h"
21#include "pedigree/kernel/utilities/demangle.h"
22#include "pedigree/kernel/utilities/utility.h"
32 demangle() : nSubstitutions(0), nTemplateParams(0), nParams(0), nLevel(0), nNameParseLevel(0) {}
34 size_t nSubstitutions;
36 size_t nTemplateParams;
40 size_t nNameParseLevel;
46#define DECLARE(id) static int parse##id(LargeStaticString&, LargeStaticString&, demangle_t&)
47#define DECLARE_LVAL(id) \
48 static int parse##id(LargeStaticString&, LargeStaticString&, demangle_t&, int&)
49#define DECLARE_SVAL(id) \
50 static int parse##id(LargeStaticString&, LargeStaticString&, demangle_t&, LargeStaticString&)
54DECLARE(UnscopedTemplateName);
57DECLARE(UnqualifiedName);
65DECLARE(PointerToMemberType);
66DECLARE(TemplateParam);
67DECLARE(TemplateTemplateParam);
78DECLARE_LVAL(Identifier);
82#define END_SUCCESS(id) \
84 printf("[%d] Success:\t %s, \t%s -> %s\n", data.nLevel--, id, (const char*)src, \
90 printf("[%d] Fail:\t %s, \t%s -> %s\n", data.nLevel--, id, (const char*)src, \
96 printf("[%d] Start:\t %s, \t%s -> %s\n", ++data.nLevel, id, (const char*)src, \
100#define END_SUCCESS(id) return SUCCESS
101#define END_FAIL(id) return FAIL
107 for (
size_t i = 0; i < data.nSubstitutions; i++)
108 if (!StringCompare(data.substitutions[i], str))
113 if (str[0] ==
':' && str[1] ==
':')
116 data.substitutions[data.nSubstitutions++] = str;
123 START(
"MangledName");
125 if (src[0] !=
'_' || src[1] !=
'Z')
126 END_FAIL(
"MangledName");
128 if (parseName(src, dest, data) == FAIL)
129 END_FAIL(
"MangledName");
134 if (data.nSubstitutions)
135 data.nSubstitutions--;
140 data.nNameParseLevel = 5;
145 if (data.nTemplateParams > 0)
146 if (parseType(src, tmp, data) == FAIL)
147 END_FAIL(
"MangledName");
151 if (parseType(src, data.params[data.nParams], data) == FAIL)
152 END_FAIL(
"MangledName");
154 }
while (src.length() > 0);
155 END_SUCCESS(
"MangledName");
166 data.nNameParseLevel++;
172 size_t ret = parseNestedName(src, dest, data);
173 data.nNameParseLevel--;
182 if (parseUnscopedTemplateName(src, dest, data) == SUCCESS &&
183 parseTemplateArgs(src, dest, data) == SUCCESS) {
184 data.nNameParseLevel--;
190 if (parseUnscopedName(src, dest, data) == SUCCESS) {
191 data.nNameParseLevel--;
194 data.nNameParseLevel--;
205 START(
"UnscopedName");
206 if (parseUnqualifiedName(src, dest, data) == SUCCESS)
207 END_SUCCESS(
"UnscopedName");
209 END_FAIL(
"UnscopedName");
218 START(
"UnscopedTemplateName");
223 if (parseSubstitution(src, dest, data) == SUCCESS)
224 END_SUCCESS(
"UnscopedTemplateName");
229 if (parseUnqualifiedName(src, dest, data) == SUCCESS)
230 END_SUCCESS(
"UnscopedTemplateName");
232 END_FAIL(
"UnscopedTemplateName");
245 END_FAIL(
"NestedName");
249 if (src[0] ==
'r' || src[0] ==
'K' || src[0] ==
'V') {
250 if (parseCvQualifiers(src, dest, data) == FAIL)
251 END_FAIL(
"NestedName");
255 if (parsePrefix(src, dest, data, thePrefix) == FAIL)
256 END_FAIL(
"NestedName");
259 END_FAIL(
"NestedName");
262 END_SUCCESS(
"NestedName");
293 if (parseSubstitution(src, dest, data) == SUCCESS)
294 END_SUCCESS(
"Prefix");
301 if (parseUnqualifiedName(src, unqualName, data) == SUCCESS) {
308 thisPrefix += unqualName;
310 addSubstitution(thisPrefix, data);
314 if (parseTemplateArgs(src, unqualName, data) == FAIL) {
319 thisPrefix += unqualName;
320 addSubstitution(thisPrefix, data);
324 if (parsePrefix(src, dest, data, thisPrefix) == SUCCESS)
325 END_SUCCESS(
"Prefix");
334 END_SUCCESS(
"Prefix");
354 START(
"UnqualifiedName");
358 if (parseOperatorName(src, dest, data) == SUCCESS)
359 END_SUCCESS(
"UnqualifiedName");
364 if (parseCtorDtorName(src, dest, data) == SUCCESS)
365 END_SUCCESS(
"UnqualifiedName");
370 if (parseSourceName(src, dest, data) == SUCCESS)
371 END_SUCCESS(
"UnqualifiedName");
373 END_FAIL(
"UnqualifiedName");
381 START(
"CtorDtorName");
382 if (src[0] ==
'C' && (src[1] ==
'0' || src[1] ==
'1' || src[1] ==
'2')) {
385 }
else if (src[0] ==
'D' && (src[1] ==
'0' || src[1] ==
'1' || src[1] ==
'2')) {
389 END_FAIL(
"CtorDtorName");
390 END_SUCCESS(
"CtorDtorName");
446 START(
"OperatorName");
452 dest +=
"operator new";
454 dest +=
"operator new[]";
456 dest +=
"operator delete";
458 dest +=
"operator delete[]";
460 dest +=
"operator+(unary)";
462 dest +=
"operator-(unary)";
464 dest +=
"operator&(unary)";
466 dest +=
"operator*(unary)";
488 dest +=
"operator+=";
490 dest +=
"operator-=";
492 dest +=
"operator*=";
494 dest +=
"operator/=";
496 dest +=
"operator%=";
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!=";
520 dest +=
"operator<=";
522 dest +=
"operator>=";
526 dest +=
"operator&&";
528 dest +=
"operator||";
530 dest +=
"operator++";
532 dest +=
"operator--";
536 dest +=
"operator->*";
538 dest +=
"operator->";
540 dest +=
"operator()";
542 dest +=
"operator[]";
546 dest +=
"operator sizeof";
548 dest +=
"operator sizeof";
549 else if (op ==
"cv") {
551 if (parseType(src, dest, data) == FAIL)
552 END_FAIL(
"OperatorName");
554 END_FAIL(
"OperatorName");
556 END_SUCCESS(
"OperatorName");
566 if (parseNumber(src, dest, data, lval) == SUCCESS && lval >= 0 &&
567 parseIdentifier(src, dest, data, lval) == SUCCESS)
568 END_SUCCESS(
"SourceName");
570 END_FAIL(
"SourceName");
581 bool bNegative =
false;
588 if (src[0] <
'0' || src[0] >
'9')
593 while (src[nLength] >=
'0' && src[nLength] <=
'9') {
594 str[nLength] = src[nLength];
598 lval = StringToUnsignedLong(str, 0, 10);
602 src.stripFirst(nLength);
604 END_SUCCESS(
"Number");
613 if (
static_cast<int>(src.length()) < lval)
614 END_FAIL(
"Identifier");
615 for (
int i = 0; i < lval; i++)
617 src.stripFirst(lval);
618 END_SUCCESS(
"Identifier");
625 START(
"CvQualifiers");
626 bool bParsedOne =
false;
643 END_FAIL(
"CvQualifiers");
645 END_SUCCESS(
"CvQualifiers");
665 if (src[0] ==
'r' || src[0] ==
'V' || src[0] ==
'K') {
667 if (parseCvQualifiers(src, tmp, data) == FAIL)
669 if (parseType(src, tmp, data) == FAIL)
672 addSubstitution(tmp, data);
676 else if (src[0] ==
'P') {
679 if (parseType(src, tmp, data) == FAIL)
684 addSubstitution(tmp, data);
688 else if (src[0] ==
'R') {
691 if (parseType(src, tmp, data) == FAIL)
696 addSubstitution(tmp, data);
700 else if (src[0] ==
'F') {
701 if (parseFunctionType(src, dest, data) == FAIL)
706 else if (src[0] ==
'A') {
707 if (parseArrayType(src, dest, data) == FAIL)
712 else if (src[0] ==
'M') {
713 if (parsePointerToMemberType(src, dest, data) == FAIL)
718 else if (src[0] ==
'T') {
722 if (parseTemplateTemplateParam(src, dest, data) == SUCCESS &&
723 parseTemplateArgs(src, dest, data) == SUCCESS)
729 if (parseTemplateParam(src, dest, data) == FAIL)
737 if (parseBuiltinType(src, dest, data) == SUCCESS)
744 if (parseName(src, tmp, data) == SUCCESS) {
746 addSubstitution(tmp, data);
753 if (parseSubstitution(src, dest, data) == FAIL)
786 START(
"BuiltinType");
804 dest +=
"unsigned char";
810 dest +=
"unsigned short";
816 dest +=
"unsigned int";
822 dest +=
"unsigned long";
828 dest +=
"unsigned __int64";
834 dest +=
"unsigned __int128";
846 END_FAIL(
"BuiltinType");
849 END_SUCCESS(
"BuiltinType");
856 START(
"FunctionType");
860 END_FAIL(
"FunctionType");
868 if (parseType(src, dest, data) == FAIL)
869 END_FAIL(
"FunctionType");
872 bool bIsFirst =
true;
878 if (parseType(src, dest, data) == FAIL)
879 END_FAIL(
"FunctionType");
880 }
while (src[0] !=
'E');
884 END_SUCCESS(
"FunctionType");
910 if (src[0] >=
'0' && src[0] <=
'9') {
912 while (src[nLength] >=
'0' && src[nLength] <=
'9')
913 bound += src[nLength++];
914 src.stripFirst(nLength);
915 }
else if (parseExpression(src, bound, data) == FAIL)
925 if (parseType(src, dest, data) == FAIL)
933 END_SUCCESS(
"Array");
941 START(
"PointerToMemberType");
945 END_FAIL(
"PointerToMemberType");
950 if (parseType(src, classType, data) == FAIL)
951 END_FAIL(
"PointerToMemberType");
960 if (parseFunctionType(src, function, data) == FAIL)
961 END_FAIL(
"PointerToMemberType");
964 while (function[nLength] !=
'(' || function[nLength + 1] !=
')')
967 dest += function.left(nLength + 1);
970 dest += function.right(function.length() - nLength - 1);
972 if (parseType(src, dest, data) == FAIL)
973 END_FAIL(
"PointerToMemberType");
978 END_SUCCESS(
"PointerToMemberType");
986 START(
"TemplateParam");
990 END_FAIL(
"TemplateParam");
996 parseNumber(src, dest, data, nId);
1002 END_FAIL(
"TemplateParam");
1007 if (nId >=
static_cast<int>(data.nTemplateParams))
1008 END_FAIL(
"TemplateParam");
1011 dest += data.templateParams[nId];
1012 END_SUCCESS(
"TemplateParam");
1021 START(
"TemplateTemplateParam");
1022 if (parseTemplateParam(src, dest, data) == SUCCESS)
1023 END_SUCCESS(
"TemplateTemplateParam");
1025 END_FAIL(
"TemplateTemplateParam");
1032 START(
"TemplateArgs");
1035 if (data.nNameParseLevel == 1)
1036 data.nTemplateParams = 0;
1039 END_FAIL(
"TemplateArgs");
1042 bool bIsFirst =
true;
1049 if (parseTemplateArg(src, tmp, data) == FAIL)
1050 END_FAIL(
"TemplateArgs");
1052 if (data.nNameParseLevel == 1) {
1053 data.templateParams[data.nTemplateParams] = tmp;
1054 data.nTemplateParams++;
1056 }
while (src[0] !=
'E');
1060 END_SUCCESS(
"TemplateArgs");
1069 START(
"TemplateArg");
1073 if (parseType(src, dest, data) == SUCCESS)
1074 END_SUCCESS(
"TemplateArg");
1079 if (src[0] ==
'X') {
1081 if (parseExpression(src, dest, data) == FAIL)
1082 END_FAIL(
"TemplateArg");
1084 END_FAIL(
"TemplateArg");
1086 END_SUCCESS(
"TemplateArg");
1092 if (parseExprPrimary(src, dest, data) == SUCCESS)
1093 END_SUCCESS(
"TemplateArg");
1095 END_FAIL(
"TemplateArg");
1109 START(
"Expression");
1111 if (src[0] ==
'T') {
1112 if (parseTemplateParam(src, dest, data) == FAIL)
1113 END_FAIL(
"Expression");
1115 END_SUCCESS(
"Expression");
1116 }
else if (src[0] ==
'L') {
1117 if (parseExprPrimary(src, dest, data) == FAIL)
1118 END_FAIL(
"Expression");
1120 END_SUCCESS(
"Expression");
1126#define UNARY_OP(prefix) \
1129 if (parseExpression(src, dest, data) == FAIL) \
1130 END_FAIL("Expression"); \
1132 END_SUCCESS("Expression"); \
1134#define BINARY_OP(infix) \
1137 if (parseExpression(src, dest, data) == FAIL) \
1138 END_FAIL("Expression"); \
1140 if (parseExpression(src, dest, data) == FAIL) \
1141 END_FAIL("Expression"); \
1144 END_SUCCESS("Expression"); \
1149 else if (op == "ng")
1151 else if (op == "ad")
1153 else if (op == "de")
1155 else if (op == "co")
1157 else if (op == "nt")
1159 else if (op == "pl")
1161 else if (op == "mi")
1163 else if (op == "ml")
1165 else if (op == "dv")
1167 else if (op == "rm")
1169 else if (op == "an")
1171 else if (op == "or")
1173 else if (op == "eo")
1175 else if (op == "ls")
1177 else if (op == "rs")
1179 else if (op == "st") {
1181 if (parseType(src, dest, data) == FAIL)
1182 END_FAIL(
"Expression");
1184 END_SUCCESS(
"Expression");
1187 END_FAIL(
"Expression");
1196 START(
"ExprPrimary");
1200 END_FAIL(
"ExprPrimary");
1206 const char* cookie = 0;
1225 if (parseType(src, dest, data) == FAIL)
1226 END_FAIL(
"ExprPrimary");
1232 if (parseNumber(src, dest, data, n) == FAIL)
1233 END_FAIL(
"ExprPrimary");
1234 dest +=
static_cast<ssize_t
>(n);
1237 END_FAIL(
"ExprPrimary");
1241 END_SUCCESS(
"ExprPrimary");
1249 START(
"Substitution");
1253 END_FAIL(
"Substitution");
1258 if (src[0] !=
'_') {
1259 parseSeqId(src, dest, data, nId);
1265 END_FAIL(
"Substitution");
1270 if (nId >=
static_cast<int>(data.nSubstitutions))
1271 END_FAIL(
"Substitution");
1274 dest += data.substitutions[nId];
1276 END_SUCCESS(
"Substitution");
1287 while ((src[nLength] >=
'0' && src[nLength] <=
'9') ||
1288 ((src[nLength] >=
'A') && src[nLength] <=
'Z')) {
1289 str[nLength] = src[nLength];
1292 str[nLength] =
'\0';
1293 lval = StringToUnsignedLong(str, 0, 36);
1295 src.stripFirst(nLength);
1296 END_SUCCESS(
"SeqId");
1356 data.nSubstitutions = 0;
1357 data.nNameParseLevel = 0;
1358 int code = parseMangledName(src, sym->name, data);
1361 if (sym->name[0] ==
':' && sym->name[1] ==
':')
1362 sym->name.stripFirst(2);
1370 sym->nParams = data.nParams;
1371 for (
size_t i = 0; i < data.nParams; i++)
1372 sym->params[i] = data.params[i];
1379 data.nSubstitutions = 0;
1380 data.nNameParseLevel = 0;
1383 int code = parseMangledName(src, dest, data);
1386 if (dest[0] ==
':' && dest[1] ==
':')
1395 for (
size_t i = 0; i < data.nParams; i++) {
1399 dest += data.params[i];