summaryrefslogtreecommitdiffstats
path: root/src/frontend/mame/ui/filesel.cpp
diff options
context:
space:
mode:
author Nathan Woods <npwoods@mess.org>2016-07-02 12:55:06 -0400
committer Nathan Woods <npwoods@mess.org>2016-07-02 14:23:54 -0400
commitd67695e724bdb7225c6701371545d4fbc16078ef (patch)
tree9fc5cc9df0bf7314fdb28cfea7bdec7126045ed6 /src/frontend/mame/ui/filesel.cpp
parent60c81498b0b777053268511e1723d5e0a8dd90ae (diff)
Converted menu_file_create to use std::string for its filename buffer
Diffstat (limited to 'src/frontend/mame/ui/filesel.cpp')
-rw-r--r--src/frontend/mame/ui/filesel.cpp43
1 files changed, 24 insertions, 19 deletions
diff --git a/src/frontend/mame/ui/filesel.cpp b/src/frontend/mame/ui/filesel.cpp
index c4338a31c17..5fc81b38495 100644
--- a/src/frontend/mame/ui/filesel.cpp
+++ b/src/frontend/mame/ui/filesel.cpp
@@ -53,24 +53,25 @@ namespace ui {
// into a buffer
//-------------------------------------------------
-template <std::size_t N, typename F>
-static void input_character(char (&buffer)[N], unicode_char unichar, F &&filter)
+template <typename F>
+static void input_character(std::string &buffer, unicode_char unichar, F &&filter)
{
- auto buflen = std::strlen(buffer);
+ auto buflen = buffer.size();
if ((unichar == 8) || (unichar == 0x7f))
{
+ // backspace
if (0 < buflen)
- *const_cast<char *>(utf8_previous_char(&buffer[buflen])) = 0;
+ {
+ auto buffer_oldend = buffer.c_str() + buflen;
+ auto buffer_newend = utf8_previous_char(buffer_oldend);
+ buffer.resize(buffer_newend - buffer.c_str());
+ }
}
else if ((unichar >= ' ') && (!filter || filter(unichar)))
{
- auto const chlen = utf8_from_uchar(&buffer[buflen], N - buflen - 1, unichar);
- if (0 <= chlen)
- {
- buflen += chlen;
- buffer[buflen] = 0;
- }
+ // append this character
+ buffer += utf8_from_uchar(unichar);
}
}
@@ -175,7 +176,11 @@ menu_file_create::menu_file_create(mame_ui_manager &mui, render_container *conta
m_ok = ok;
*m_ok = true;
auto const sep = current_file.rfind(PATH_SEPARATOR);
- std::strncpy(m_filename_buffer, current_file.c_str() + ((std::string::npos == sep) ? 0 : (sep + 1)), sizeof(m_filename_buffer));
+
+ m_filename.reserve(1024);
+ m_filename = sep != std::string::npos
+ ? current_file.substr(sep + strlen(PATH_SEPARATOR), current_file.size() - sep - strlen(PATH_SEPARATOR))
+ : current_file;
}
@@ -208,19 +213,19 @@ void menu_file_create::populate()
{
std::string buffer;
const image_device_format *format;
- const char *new_image_name;
+ const std::string *new_image_name;
// append the "New Image Name" item
if (get_selection() == ITEMREF_NEW_IMAGE_NAME)
{
- buffer.append(m_filename_buffer).append("_");
- new_image_name = buffer.c_str();
+ buffer = m_filename + "_";
+ new_image_name = &buffer;
}
else
{
- new_image_name = m_filename_buffer;
+ new_image_name = &m_filename;
}
- item_append(_("New Image Name:"), new_image_name, 0, ITEMREF_NEW_IMAGE_NAME);
+ item_append(_("New Image Name:"), *new_image_name, 0, ITEMREF_NEW_IMAGE_NAME);
// do we support multiple formats?
if (ENABLE_FORMATS) format = m_image->formatlist().front().get();
@@ -256,10 +261,10 @@ void menu_file_create::handle()
case IPT_UI_SELECT:
if ((event->itemref == ITEMREF_CREATE) || (event->itemref == ITEMREF_NEW_IMAGE_NAME))
{
- std::string tmp_file(m_filename_buffer);
+ std::string tmp_file(m_filename);
if (tmp_file.find(".") != -1 && tmp_file.find(".") < tmp_file.length() - 1)
{
- m_current_file = m_filename_buffer;
+ m_current_file = m_filename;
menu::stack_pop(machine());
}
else
@@ -270,7 +275,7 @@ void menu_file_create::handle()
case IPT_SPECIAL:
if (get_selection() == ITEMREF_NEW_IMAGE_NAME)
{
- input_character(m_filename_buffer,event->unichar, &is_valid_filename_char);
+ input_character(m_filename, event->unichar, &is_valid_filename_char);
reset(reset_options::REMEMBER_POSITION);
}
break;