Lines Matching defs:rdm
89 peek (const struct rust_demangler *rdm)
91 if (rdm->next < rdm->sym_len)
92 return rdm->sym[rdm->next];
97 eat (struct rust_demangler *rdm, char c)
99 if (peek (rdm) == c)
101 rdm->next++;
109 next (struct rust_demangler *rdm)
111 char c = peek (rdm);
113 rdm->errored = 1;
115 rdm->next++;
120 parse_integer_62 (struct rust_demangler *rdm)
125 if (eat (rdm, '_'))
129 while (!eat (rdm, '_') && !rdm->errored)
131 c = next (rdm);
141 rdm->errored = 1;
149 parse_opt_integer_62 (struct rust_demangler *rdm, char tag)
151 if (!eat (rdm, tag))
153 return 1 + parse_integer_62 (rdm);
157 parse_disambiguator (struct rust_demangler *rdm)
159 return parse_opt_integer_62 (rdm, 's');
163 parse_hex_nibbles (struct rust_demangler *rdm, uint64_t *value)
171 while (!eat (rdm, '_'))
175 c = next (rdm);
182 rdm->errored = 1;
203 parse_ident (struct rust_demangler *rdm)
215 if (rdm->version != -1)
216 is_punycode = eat (rdm, 'u');
218 c = next (rdm);
221 rdm->errored = 1;
227 while (ISDIGIT (peek (rdm)))
228 len = len * 10 + (next (rdm) - '0');
231 if (rdm->version != -1)
232 eat (rdm, '_');
234 start = rdm->next;
235 rdm->next += len;
237 if ((start > rdm->next) || (rdm->next > rdm->sym_len))
239 rdm->errored = 1;
243 ident.ascii = rdm->sym + start;
261 rdm->errored = 1;
276 print_str (struct rust_demangler *rdm, const char *data, size_t len)
278 if (!rdm->errored && !rdm->skipping_printing)
279 rdm->callback (data, len, rdm->callback_opaque);
282 #define PRINT(s) print_str (rdm, s, strlen (s))
285 print_uint64 (struct rust_demangler *rdm, uint64_t x)
293 print_uint64_hex (struct rust_demangler *rdm, uint64_t x)
377 print_ident (struct rust_demangler *rdm, struct rust_mangled_ident ident)
387 if (rdm->errored || rdm->skipping_printing)
390 if (rdm->version == -1)
410 print_str (rdm, &unescaped, 1);
414 print_str (rdm, ident.ascii, ident.ascii_len);
439 print_str (rdm, ident.ascii, len);
451 print_str (rdm, ident.ascii, ident.ascii_len);
463 rdm->errored = 1;
472 rdm->errored = 1;
522 rdm->errored = 1;
544 rdm->errored = 1;
551 rdm->errored = 1;
591 print_str (rdm, (const char *)out, j);
601 print_lifetime_from_index (struct rust_demangler *rdm, uint64_t lt)
613 depth = rdm->bound_lifetime_depth - lt;
618 print_str (rdm, &c, 1);
624 print_uint64 (rdm, depth);
630 static void demangle_binder (struct rust_demangler *rdm);
631 static void demangle_path (struct rust_demangler *rdm, int in_value);
632 static void demangle_generic_arg (struct rust_demangler *rdm);
633 static void demangle_type (struct rust_demangler *rdm);
634 static int demangle_path_maybe_open_generics (struct rust_demangler *rdm);
635 static void demangle_dyn_trait (struct rust_demangler *rdm);
636 static void demangle_const (struct rust_demangler *rdm);
637 static void demangle_const_uint (struct rust_demangler *rdm);
638 static void demangle_const_int (struct rust_demangler *rdm);
639 static void demangle_const_bool (struct rust_demangler *rdm);
640 static void demangle_const_char (struct rust_demangler *rdm);
646 demangle_binder (struct rust_demangler *rdm)
650 if (rdm->errored)
653 bound_lifetimes = parse_opt_integer_62 (rdm, 'G');
661 rdm->bound_lifetime_depth++;
662 print_lifetime_from_index (rdm, 1);
669 demangle_path (struct rust_demangler *rdm, int in_value)
677 if (rdm->errored)
680 if (rdm->recursion != RUST_NO_RECURSION_LIMIT)
682 ++ rdm->recursion;
683 if (rdm->recursion > RUST_MAX_RECURSION_COUNT)
689 switch (tag = next (rdm))
692 dis = parse_disambiguator (rdm);
693 name = parse_ident (rdm);
695 print_ident (rdm, name);
696 if (rdm->verbose)
699 print_uint64_hex (rdm, dis);
704 rdm);
708 demangle_path (rdm, in_value);
710 dis = parse_disambiguator (rdm);
711 name = parse_ident (rdm);
726 print_str (rdm, &ns, 1);
731 print_ident (rdm, name);
734 print_uint64 (rdm, dis);
744 print_ident (rdm, name);
751 parse_disambiguator (rdm);
752 was_skipping_printing = rdm->skipping_printing;
753 rdm->skipping_printing = 1;
754 demangle_path (rdm, in_value);
755 rdm->skipping_printing = was_skipping_printing;
759 demangle_type (rdm);
763 demangle_path (rdm, 0);
768 demangle_path (rdm, in_value);
772 for (i = 0; !rdm->errored && !eat (rdm, 'E'); i++)
776 demangle_generic_arg (rdm);
781 backref = parse_integer_62 (rdm);
782 if (!rdm->skipping_printing)
784 old_next = rdm->next;
785 rdm->next = backref;
786 demangle_path (rdm, in_value);
787 rdm->next = old_next;
796 rdm->errored = 1;
798 if (rdm->recursion != RUST_NO_RECURSION_LIMIT)
799 -- rdm->recursion;
803 demangle_generic_arg (struct rust_demangler *rdm)
806 if (eat (rdm, 'L'))
808 lt = parse_integer_62 (rdm);
809 print_lifetime_from_index (rdm, lt);
811 else if (eat (rdm, 'K'))
812 demangle_const (rdm);
814 demangle_type (rdm);
871 demangle_type (struct rust_demangler *rdm)
879 if (rdm->errored)
882 tag = next (rdm);
891 if (rdm->recursion != RUST_NO_RECURSION_LIMIT)
893 ++ rdm->recursion;
894 if (rdm->recursion > RUST_MAX_RECURSION_COUNT)
898 rdm->errored = 1;
899 -- rdm->recursion;
909 if (eat (rdm, 'L'))
911 lt = parse_integer_62 (rdm);
914 print_lifetime_from_index (rdm, lt);
920 demangle_type (rdm);
929 demangle_type (rdm);
934 demangle_type (rdm);
938 demangle_const (rdm);
944 for (i = 0; !rdm->errored && !eat (rdm, 'E'); i++)
948 demangle_type (rdm);
955 old_bound_lifetime_depth = rdm->bound_lifetime_depth;
956 demangle_binder (rdm);
958 if (eat (rdm, 'U'))
961 if (eat (rdm, 'K'))
963 if (eat (rdm, 'C'))
970 abi = parse_ident (rdm);
973 rdm->errored = 1;
986 print_str (rdm, abi.ascii, i);
993 print_str (rdm, abi.ascii, abi.ascii_len);
999 for (i = 0; !rdm->errored && !eat (rdm, 'E'); i++)
1003 demangle_type (rdm);
1007 if (eat (rdm, 'u'))
1014 demangle_type (rdm);
1019 rdm->bound_lifetime_depth = old_bound_lifetime_depth;
1024 old_bound_lifetime_depth = rdm->bound_lifetime_depth;
1025 demangle_binder (rdm);
1027 for (i = 0; !rdm->errored && !eat (rdm, 'E'); i++)
1031 demangle_dyn_trait (rdm);
1035 rdm->bound_lifetime_depth = old_bound_lifetime_depth;
1037 if (!eat (rdm, 'L'))
1039 rdm->errored = 1;
1042 lt = parse_integer_62 (rdm);
1046 print_lifetime_from_index (rdm, lt);
1050 backref = parse_integer_62 (rdm);
1051 if (!rdm->skipping_printing)
1053 old_next = rdm->next;
1054 rdm->next = backref;
1055 demangle_type (rdm);
1056 rdm->next = old_next;
1061 rdm->next--;
1062 demangle_path (rdm, 0);
1065 if (rdm->recursion != RUST_NO_RECURSION_LIMIT)
1066 -- rdm->recursion;
1075 demangle_path_maybe_open_generics (struct rust_demangler *rdm)
1082 if (rdm->errored)
1085 if (rdm->recursion != RUST_NO_RECURSION_LIMIT)
1087 ++ rdm->recursion;
1088 if (rdm->recursion > RUST_MAX_RECURSION_COUNT)
1092 rdm->errored = 1;
1097 if (eat (rdm, 'B'))
1099 backref = parse_integer_62 (rdm);
1100 if (!rdm->skipping_printing)
1102 old_next = rdm->next;
1103 rdm->next = backref;
1104 open = demangle_path_maybe_open_generics (rdm);
1105 rdm->next = old_next;
1108 else if (eat (rdm, 'I'))
1110 demangle_path (rdm, 0);
1113 for (i = 0; !rdm->errored && !eat (rdm, 'E'); i++)
1117 demangle_generic_arg (rdm);
1121 demangle_path (rdm, 0);
1124 if (rdm->recursion != RUST_NO_RECURSION_LIMIT)
1125 -- rdm->recursion;
1131 demangle_dyn_trait (struct rust_demangler *rdm)
1136 if (rdm->errored)
1139 open = demangle_path_maybe_open_generics (rdm);
1141 while (eat (rdm, 'p'))
1149 name = parse_ident (rdm);
1150 print_ident (rdm, name);
1152 demangle_type (rdm);
1160 demangle_const (struct rust_demangler *rdm)
1165 if (rdm->errored)
1168 if (rdm->recursion != RUST_NO_RECURSION_LIMIT)
1170 ++ rdm->recursion;
1171 if (rdm->recursion > RUST_MAX_RECURSION_COUNT)
1177 if (eat (rdm, 'B'))
1179 backref = parse_integer_62 (rdm);
1180 if (!rdm->skipping_printing)
1182 old_next = rdm->next;
1183 rdm->next = backref;
1184 demangle_const (rdm);
1185 rdm->next = old_next;
1190 ty_tag = next (rdm);
1205 demangle_const_uint (rdm);
1215 demangle_const_int (rdm);
1220 demangle_const_bool (rdm);
1225 demangle_const_char (rdm);
1232 if (!rdm->errored && rdm->verbose)
1240 rdm->errored = 1;
1242 if (rdm->recursion != RUST_NO_RECURSION_LIMIT)
1243 -- rdm->recursion;
1247 demangle_const_uint (struct rust_demangler *rdm)
1252 if (rdm->errored)
1255 hex_len = parse_hex_nibbles (rdm, &value);
1261 print_str (rdm, rdm->sym + (rdm->next - hex_len), hex_len);
1264 print_uint64 (rdm, value);
1266 rdm->errored = 1;
1270 demangle_const_int (struct rust_demangler *rdm)
1272 if (eat (rdm, 'n'))
1274 demangle_const_uint (rdm);
1278 demangle_const_bool (struct rust_demangler *rdm)
1282 if (parse_hex_nibbles (rdm, &value) != 1)
1284 rdm->errored = 1;
1293 rdm->errored = 1;
1297 demangle_const_char (struct rust_demangler *rdm)
1302 hex_len = parse_hex_nibbles (rdm, &value);
1306 rdm->errored = 1;
1323 print_str (rdm, &c, 1);
1328 print_uint64_hex (rdm, value);
1372 struct rust_demangler rdm;
1375 rdm.sym = mangled;
1376 rdm.sym_len = 0;
1378 rdm.callback_opaque = opaque;
1379 rdm.callback = callback;
1381 rdm.next = 0;
1382 rdm.errored = 0;
1383 rdm.skipping_printing = 0;
1384 rdm.verbose = (options & DMGL_VERBOSE) != 0;
1385 rdm.version = 0;
1386 rdm.recursion = (options & DMGL_NO_RECURSE_LIMIT) ? RUST_NO_RECURSION_LIMIT : 0;
1387 rdm.bound_lifetime_depth = 0;
1390 if (rdm.sym[0] == '_' && rdm.sym[1] == 'R')
1391 rdm.sym += 2;
1392 else if (rdm.sym[0] == '_' && rdm.sym[1] == 'Z' && rdm.sym[2] == 'N')
1394 rdm.sym += 3;
1395 rdm.version = -1;
1401 if (rdm.version != -1 && !ISUPPER (rdm.sym[0]))
1405 for (p = rdm.sym; *p; p++)
1408 if (rdm.version == 0 && *p == '.')
1411 rdm.sym_len++;
1418 if (rdm.version == -1 && (*p == '$' || *p == '.' || *p == ':'
1426 if (rdm.version == -1)
1431 while (rdm.sym_len > 0 &&
1432 !(dot_suffix && rdm.sym[rdm.sym_len - 1] == 'E'))
1434 dot_suffix = rdm.sym[rdm.sym_len - 1] == '.';
1435 rdm.sym_len--;
1438 if (!(rdm.sym_len > 0 && rdm.sym[rdm.sym_len - 1] == 'E'))
1440 rdm.sym_len--;
1446 if (!(rdm.sym_len > 19
1447 && !memcmp (&rdm.sym[rdm.sym_len - 19], "17h", 3)))
1452 ident = parse_ident (&rdm);
1453 if (rdm.errored || !ident.ascii)
1456 while (rdm.next < rdm.sym_len);
1463 rdm.next = 0;
1464 if (!rdm.verbose && rdm.sym_len > 19)
1467 rdm.sym_len -= 19;
1472 if (rdm.next > 0)
1473 print_str (&rdm, "::", 2);
1475 ident = parse_ident (&rdm);
1476 print_ident (&rdm, ident);
1478 while (rdm.next < rdm.sym_len);
1482 demangle_path (&rdm, 1);
1485 if (!rdm.errored && rdm.next < rdm.sym_len)
1487 rdm.skipping_printing = 1;
1488 demangle_path (&rdm, 0);
1492 rdm.errored |= rdm.next != rdm.sym_len;
1495 return !rdm.errored;