/* Split a symbol name. Copyright (C) 2022-2023 Free Software Foundation, Inc. This file is part of GDB. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "defs.h" #include "split-name.h" #include "cp-support.h" /* See split-name.h. */ std::vector split_name (const char *name, split_style style) { std::vector result; unsigned int previous_len = 0; switch (style) { case split_style::CXX: for (unsigned int current_len = cp_find_first_component (name); name[current_len] != '\0'; current_len += cp_find_first_component (name + current_len)) { gdb_assert (name[current_len] == ':'); result.emplace_back (&name[previous_len], current_len - previous_len); /* Skip the '::'. */ current_len += 2; previous_len = current_len; } break; case split_style::UNDERSCORE: /* Handle the Ada encoded (aka mangled) form here. */ for (const char *iter = strstr (name, "__"); iter != nullptr; iter = strstr (iter, "__")) { result.emplace_back (&name[previous_len], iter - &name[previous_len]); iter += 2; previous_len = iter - name; } break; case split_style::DOT: /* D and Go-style names. */ for (const char *iter = strchr (name, '.'); iter != nullptr; iter = strchr (iter, '.')) { result.emplace_back (&name[previous_len], iter - &name[previous_len]); ++iter; previous_len = iter - name; } break; default: break; } result.emplace_back (&name[previous_len]); return result; }