diff options
author | 2016-07-02 12:55:06 -0400 | |
---|---|---|
committer | 2016-07-02 14:23:54 -0400 | |
commit | d67695e724bdb7225c6701371545d4fbc16078ef (patch) | |
tree | 9fc5cc9df0bf7314fdb28cfea7bdec7126045ed6 /src/frontend/mame/ui/filesel.cpp | |
parent | 60c81498b0b777053268511e1723d5e0a8dd90ae (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.cpp | 43 |
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; |