/* Split a symbol name.

   Copyright (C) 2022 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 <http://www.gnu.org/licenses/>.  */

#include "defs.h"
#include "split-name.h"
#include "cp-support.h"

/* See split-name.h.  */

std::vector<gdb::string_view>
split_name (const char *name, split_style style)
{
  std::vector<gdb::string_view> 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;
}

