diff --git a/src/common/resources/inputstreambuffer.cpp b/src/common/resources/inputstreambuffer.cpp index 88defef1..f4a0eb86 100644 --- a/src/common/resources/inputstreambuffer.cpp +++ b/src/common/resources/inputstreambuffer.cpp @@ -24,22 +24,22 @@ #include #include -CInputStreamBuffer::CInputStreamBuffer(size_t buffer_size) : m_buffer_size(buffer_size) +CInputStreamBuffer::CInputStreamBuffer(size_t bufferSize) + : m_bufferSize(bufferSize) + , m_file(nullptr) { - if (buffer_size <= 0) + if (bufferSize <= 0) { throw std::runtime_error("File buffer must be larger then 0 bytes"); } - m_buffer = new char[buffer_size]; - m_file = nullptr; + m_buffer = std::unique_ptr(new char[bufferSize]); } CInputStreamBuffer::~CInputStreamBuffer() { close(); - delete m_buffer; } @@ -59,7 +59,7 @@ void CInputStreamBuffer::close() bool CInputStreamBuffer::is_open() { - return m_file; + return m_file != nullptr; } @@ -77,11 +77,11 @@ std::streambuf::int_type CInputStreamBuffer::underflow() if (PHYSFS_eof(m_file)) return traits_type::eof(); - PHYSFS_sint64 read_count = PHYSFS_read(m_file, m_buffer, sizeof(char), m_buffer_size); + PHYSFS_sint64 read_count = PHYSFS_read(m_file, m_buffer.get(), sizeof(char), m_bufferSize); if (read_count <= 0) return traits_type::eof(); - setg(m_buffer, m_buffer, m_buffer + read_count); + setg(m_buffer.get(), m_buffer.get(), m_buffer.get() + read_count); return traits_type::to_int_type(*gptr()); } @@ -96,7 +96,7 @@ std::streampos CInputStreamBuffer::seekpos(std::streampos sp, std::ios_base::ope std::streampos CInputStreamBuffer::seekoff(std::streamoff off, std::ios_base::seekdir way, std::ios_base::openmode which) { /* A bit of explanation: - We are reading file by m_buffer_size parts so our 3 internal pointers will be + We are reading file by m_bufferSize parts so our 3 internal pointers will be * eback (not used here) - start of block * gptr - position of read cursor in block * egtpr - end of block @@ -125,7 +125,7 @@ std::streampos CInputStreamBuffer::seekoff(std::streamoff off, std::ios_base::se if (PHYSFS_seek(m_file, new_position)) { - setg(m_buffer, m_buffer, m_buffer); // reset buffer + setg(m_buffer.get(), m_buffer.get(), m_buffer.get()); // reset buffer return pos_type(new_position); } diff --git a/src/common/resources/inputstreambuffer.h b/src/common/resources/inputstreambuffer.h index 8c45c223..f9677956 100644 --- a/src/common/resources/inputstreambuffer.h +++ b/src/common/resources/inputstreambuffer.h @@ -19,33 +19,33 @@ #pragma once +#include #include #include + #include class CInputStreamBuffer : public std::streambuf { public: - CInputStreamBuffer(size_t buffer_size = 512); + CInputStreamBuffer(size_t bufferSize = 512); virtual ~CInputStreamBuffer(); + CInputStreamBuffer(const CInputStreamBuffer &) = delete; + CInputStreamBuffer &operator= (const CInputStreamBuffer &) = delete; + void open(const std::string &filename); void close(); bool is_open(); size_t size(); private: - int_type underflow(); + int_type underflow() override; - std::streampos seekpos(std::streampos sp, std::ios_base::openmode which); - std::streampos seekoff(std::streamoff off, std::ios_base::seekdir way, std::ios_base::openmode which); - - // copy ctor and assignment not implemented; - // copying not allowed - CInputStreamBuffer(const CInputStreamBuffer &); - CInputStreamBuffer &operator= (const CInputStreamBuffer &); + std::streampos seekpos(std::streampos sp, std::ios_base::openmode which) override; + std::streampos seekoff(std::streamoff off, std::ios_base::seekdir way, std::ios_base::openmode which) override; + const size_t m_bufferSize; PHYSFS_File *m_file; - char *m_buffer; - size_t m_buffer_size; + std::unique_ptr m_buffer; }; diff --git a/src/common/resources/outputstreambuffer.cpp b/src/common/resources/outputstreambuffer.cpp index 157e17d7..a5cc4ca7 100644 --- a/src/common/resources/outputstreambuffer.cpp +++ b/src/common/resources/outputstreambuffer.cpp @@ -24,18 +24,22 @@ #include #include -COutputStreamBuffer::COutputStreamBuffer(size_t buffer_size) : m_buffer_size(buffer_size) +COutputStreamBuffer::COutputStreamBuffer(size_t bufferSize) + : m_file(nullptr) { - m_file = nullptr; - m_buffer = new char[buffer_size]; - setp(m_buffer, m_buffer + buffer_size); + if (bufferSize <= 0) + { + throw std::runtime_error("File buffer must be larger then 0 bytes"); + } + + m_buffer = std::unique_ptr(new char[bufferSize]); + setp(m_buffer.get(), m_buffer.get() + bufferSize); } COutputStreamBuffer::~COutputStreamBuffer() { close(); - delete m_buffer; } @@ -56,7 +60,7 @@ void COutputStreamBuffer::close() bool COutputStreamBuffer::is_open() { - return m_file; + return m_file != nullptr; } diff --git a/src/common/resources/outputstreambuffer.h b/src/common/resources/outputstreambuffer.h index 758c4df0..b15d2322 100644 --- a/src/common/resources/outputstreambuffer.h +++ b/src/common/resources/outputstreambuffer.h @@ -19,28 +19,29 @@ #pragma once +#include #include #include + #include class COutputStreamBuffer : public std::streambuf { public: - COutputStreamBuffer(size_t buffer_size = 512); + COutputStreamBuffer(size_t bufferSize = 512); virtual ~COutputStreamBuffer(); + + COutputStreamBuffer(const COutputStreamBuffer &) = delete; + COutputStreamBuffer &operator= (const COutputStreamBuffer &) = delete; + void open(const std::string &filename); void close(); bool is_open(); private: - int_type overflow(int_type ch); - int sync(); + int_type overflow(int_type ch) override; + int sync() override; - // copy ctor and assignment not implemented; - // copying not allowed - COutputStreamBuffer(const COutputStreamBuffer &); - COutputStreamBuffer &operator= (const COutputStreamBuffer &); PHYSFS_File *m_file; - char *m_buffer; - size_t m_buffer_size; + std::unique_ptr m_buffer; }; diff --git a/src/ui/edit.cpp b/src/ui/edit.cpp index 113786dd..4e60b3c1 100644 --- a/src/ui/edit.cpp +++ b/src/ui/edit.cpp @@ -88,11 +88,9 @@ bool IsSep(int character) CEdit::CEdit () : CControl () { Math::Point pos; - int i; m_maxChar = 100; - m_text = new char[m_maxChar+1]; - memset(m_text, 0, m_maxChar+1); + m_text = std::vector(m_maxChar+1, '\0'); m_len = 0; memset(m_lineOffset, 0, sizeof(int) * EDITLINEMAX); @@ -114,10 +112,6 @@ CEdit::CEdit () : CControl () HyperFlush(); - for ( i=0 ; iGetText()->Detect(m_text+m_lineOffset[i], +// c = m_engine->GetText()->Detect(m_text.data()+m_lineOffset[i], // len, offset, m_fontSize, // m_fontStretch, m_fontType); - c = m_engine->GetText()->Detect(std::string(m_text+m_lineOffset[i]).substr(0, len), m_fontType, m_fontSize, offset); // TODO check if good + c = m_engine->GetText()->Detect(std::string(m_text.data()+m_lineOffset[i]).substr(0, len), m_fontType, m_fontSize, offset); // TODO check if good } else { size = m_fontSize; if ( bTitle ) size *= Gfx::FONT_SIZE_BIG; -// c = m_engine->GetText()->Detect(m_text+m_lineOffset[i], +// c = m_engine->GetText()->Detect(m_text.data()+m_lineOffset[i], // m_format+m_lineOffset[i], // len, offset, size, // m_fontStretch); - c = m_engine->GetText()->Detect(std::string(m_text+m_lineOffset[i]).substr(0, len), + c = m_engine->GetText()->Detect(std::string(m_text.data()+m_lineOffset[i]).substr(0, len), m_format.begin() + m_lineOffset[i], m_format.end(), size, @@ -1037,16 +1022,16 @@ void CEdit::Draw() if ( m_format.size() == 0 ) { - start.x = ppos.x+m_engine->GetText()->GetStringWidth(std::string(m_text+beg).substr(0, o1-beg), m_fontType, size); - end.x = m_engine->GetText()->GetStringWidth(std::string(m_text+o1).substr(0, o2-o1), m_fontType, size); + start.x = ppos.x+m_engine->GetText()->GetStringWidth(std::string(m_text.data()+beg).substr(0, o1-beg), m_fontType, size); + end.x = m_engine->GetText()->GetStringWidth(std::string(m_text.data()+o1).substr(0, o2-o1), m_fontType, size); } else { - start.x = ppos.x+m_engine->GetText()->GetStringWidth(std::string(m_text+beg).substr(0, o1-beg), + start.x = ppos.x+m_engine->GetText()->GetStringWidth(std::string(m_text.data()+beg).substr(0, o1-beg), m_format.begin() + beg, m_format.end(), size); - end.x = m_engine->GetText()->GetStringWidth(std::string(m_text+o1).substr(0, o2-o1), + end.x = m_engine->GetText()->GetStringWidth(std::string(m_text.data()+o1).substr(0, o2-o1), m_format.begin() + o1, m_format.end(), size); @@ -1071,11 +1056,11 @@ void CEdit::Draw() if ( !m_bMulti || !m_bDisplaySpec ) eol = 0; if ( m_format.size() == 0 ) { - m_engine->GetText()->DrawText(std::string(m_text+beg).substr(0, len), m_fontType, size, ppos, m_dim.x, Gfx::TEXT_ALIGN_LEFT, eol); + m_engine->GetText()->DrawText(std::string(m_text.data()+beg).substr(0, len), m_fontType, size, ppos, m_dim.x, Gfx::TEXT_ALIGN_LEFT, eol); } else { - m_engine->GetText()->DrawText(std::string(m_text+beg).substr(0, len), + m_engine->GetText()->DrawText(std::string(m_text.data()+beg).substr(0, len), m_format.begin() + beg, m_format.end(), size, @@ -1112,13 +1097,13 @@ void CEdit::Draw() if ( m_format.size() == 0 ) { - m_engine->GetText()->SizeText(std::string(m_text+m_lineOffset[i]).substr(0, len), m_fontType, + m_engine->GetText()->SizeText(std::string(m_text.data()+m_lineOffset[i]).substr(0, len), m_fontType, size, pos, Gfx::TEXT_ALIGN_LEFT, start, end); } else { - m_engine->GetText()->SizeText(std::string(m_text+m_lineOffset[i]).substr(0, len), + m_engine->GetText()->SizeText(std::string(m_text.data()+m_lineOffset[i]).substr(0, len), m_format.begin() + m_lineOffset[i], m_format.end(), size, pos, Gfx::TEXT_ALIGN_LEFT, @@ -1284,7 +1269,7 @@ void CEdit::SetText(const char *text, bool bNew) } else { - strncpy(m_text, text, m_len); + strncpy(m_text.data(), text, m_len); } } else @@ -1367,7 +1352,7 @@ void CEdit::SetText(const char *text, bool bNew) char* CEdit::GetText() { m_text[m_len] = 0; - return m_text; + return m_text.data(); } // Returns the edited text. @@ -1377,7 +1362,7 @@ void CEdit::GetText(char *buffer, int max) if ( m_len < max ) max = m_len; if ( m_len > max ) max = max-1; - strncpy(buffer, m_text, max); + strncpy(buffer, m_text.data(), max); buffer[max] = 0; } @@ -1451,7 +1436,6 @@ void CEdit::LoadImage(std::string name) bool CEdit::ReadText(std::string filename, int addSize) { - char *buffer; int len, i, j, n, font, iIndex, iLines, iCount, iLink; char iName[50]; float iWidth; @@ -1478,15 +1462,11 @@ bool CEdit::ReadText(std::string filename, int addSize) FreeImage(); - delete[] m_text; + m_text = std::vector(m_maxChar+1, '\0'); - m_text = new char[m_maxChar+1]; - memset(m_text, 0, m_maxChar+1); + std::vector buffer(m_maxChar+1, '\0'); - buffer = new char[m_maxChar+1]; - memset(buffer, 0, m_maxChar+1); - - stream.read(buffer, len); + stream.read(buffer.data(), len); m_format.clear(); m_format.reserve(m_maxChar+1); @@ -1598,13 +1578,13 @@ bool CEdit::ReadText(std::string filename, int addSize) { if ( iLink < EDITLINKMAX ) { - m_link[iLink].name = GetNameParam(buffer+i+3, 0); - m_link[iLink].marker = GetNameParam(buffer+i+3, 1); + m_link[iLink].name = GetNameParam(buffer.data()+i+3, 0); + m_link[iLink].marker = GetNameParam(buffer.data()+i+3, 1); iLink ++; } font &= ~Gfx::FONT_MASK_HIGHLIGHT; } - i += strchr(buffer+i, ';')-(buffer+i)+1; + i += strchr(buffer.data()+i, ';')-(buffer.data()+i)+1; } else if (// m_format.size() > 0 && buffer[i+0] == '\\' && // \m marker; ? @@ -1615,12 +1595,12 @@ bool CEdit::ReadText(std::string filename, int addSize) { if ( m_markerTotal < EDITLINKMAX ) { - m_marker[m_markerTotal].name = GetNameParam(buffer+i+3, 0); + m_marker[m_markerTotal].name = GetNameParam(buffer.data()+i+3, 0); m_marker[m_markerTotal].pos = j; m_markerTotal ++; } } - i += strchr(buffer+i, ';')-(buffer+i)+1; + i += strchr(buffer.data()+i, ';')-(buffer.data()+i)+1; } else if ( //m_format.size() > 0 && buffer[i+0] == '\\' && // \image name lx ly; ? @@ -1634,12 +1614,12 @@ bool CEdit::ReadText(std::string filename, int addSize) if ( m_bSoluce || !bInSoluce ) { - strcpy(iName, GetNameParam(buffer+i+7, 0).c_str()); + strcpy(iName, GetNameParam(buffer.data()+i+7, 0).c_str()); -//? iWidth = m_lineHeight*RetValueParam(buffer+i+7, 1); - iWidth = static_cast(GetValueParam(buffer+i+7, 1)); +//? iWidth = m_lineHeight*RetValueParam(buffer.data()+i+7, 1); + iWidth = static_cast(GetValueParam(buffer.data()+i+7, 1)); iWidth *= m_engine->GetText()->GetHeight(Gfx::FONT_COLOBOT, Gfx::FONT_SIZE_SMALL); - iLines = GetValueParam(buffer+i+7, 2); + iLines = GetValueParam(buffer.data()+i+7, 2); LoadImage(std::string(iName)); // A part of image per line of text. @@ -1660,7 +1640,7 @@ bool CEdit::ReadText(std::string filename, int addSize) j ++; } } - i += strchr(buffer+i, ';')-(buffer+i)+1; + i += strchr(buffer.data()+i, ';')-(buffer.data()+i)+1; } else if ( //m_format.size() > 0 && buffer[i+0] == '\\' && // \button; ? @@ -1674,11 +1654,11 @@ bool CEdit::ReadText(std::string filename, int addSize) { if ( m_bSoluce || !bInSoluce ) { - m_text[j] = GetValueParam(buffer+i+8, 0); + m_text[j] = GetValueParam(buffer.data()+i+8, 0); m_format[j] = font|Gfx::FONT_BUTTON; j ++; } - i += strchr(buffer+i, ';')-(buffer+i)+1; + i += strchr(buffer.data()+i, ';')-(buffer.data()+i)+1; } else if ( //m_format.size() > 0 && buffer[i+0] == '\\' && // \token; ? @@ -1848,8 +1828,6 @@ bool CEdit::ReadText(std::string filename, int addSize) m_len = j; m_imageTotal = iIndex; - delete[] buffer; - Justif(); ColumnFix(); return true; @@ -1925,12 +1903,9 @@ void CEdit::SetMaxChar(int max) { FreeImage(); - delete[] m_text; - m_maxChar = max; - m_text = new char[m_maxChar+1]; - memset(m_text, 0, m_maxChar+1); + m_text = std::vector(m_maxChar+1, '\0'); m_format.clear(); m_format.reserve(m_maxChar+1); @@ -2431,13 +2406,13 @@ void CEdit::MoveLine(int move, bool bWord, bool bSelect) if ( m_format.size() == 0 ) { - c = m_engine->GetText()->Detect(std::string(m_text+m_lineOffset[line]), + c = m_engine->GetText()->Detect(std::string(m_text.data()+m_lineOffset[line]), m_fontType, m_fontSize, m_lineOffset[line+1]-m_lineOffset[line]); } else { - c = m_engine->GetText()->Detect(std::string(m_text+m_lineOffset[line]), + c = m_engine->GetText()->Detect(std::string(m_text.data()+m_lineOffset[line]), m_format.begin() + m_lineOffset[line], m_format.end(), m_fontSize, @@ -2463,13 +2438,13 @@ void CEdit::ColumnFix() if ( m_format.size() == 0 ) { m_column = m_engine->GetText()->GetStringWidth( - std::string(m_text+m_lineOffset[line]), + std::string(m_text.data()+m_lineOffset[line]), m_fontType, m_fontSize); } else { m_column = m_engine->GetText()->GetStringWidth( - std::string(m_text+m_lineOffset[line]), + std::string(m_text.data()+m_lineOffset[line]), m_format.begin() + m_lineOffset[line], m_format.end(), m_fontSize @@ -2504,7 +2479,6 @@ bool CEdit::Cut() bool CEdit::Copy(bool memorize_cursor) { int c1, c2, start, len; - char *text; c1 = m_cursor1; c2 = m_cursor2; @@ -2541,11 +2515,10 @@ bool CEdit::Copy(bool memorize_cursor) start = c1; len = c2 - c1; - text = new char[len + 1]; - strncpy(text, m_text + start, len); + std::vector text(len + 1, '\0'); + strncpy(text.data(), m_text.data() + start, len); text[len] = 0; - widgetSetClipboardText(text); - delete []text; + widgetSetClipboardText(text.data()); if (memorize_cursor) { @@ -2728,7 +2701,7 @@ void CEdit::InsertOne(char character) if ( m_len >= m_maxChar ) return; - for ( i=m_len ; i>=m_cursor1 ; i-- ) + for ( i=m_len ; i>m_cursor1 ; i-- ) { m_text[i] = m_text[i-1]; // shoot @@ -2742,7 +2715,7 @@ void CEdit::InsertOne(char character) m_text[m_cursor1] = character; - if ( m_format.size() > static_cast(m_cursor1) ) + if ( static_cast(m_cursor1) < m_format.size() ) { m_format[m_cursor1] = 0; } @@ -2989,7 +2962,7 @@ void CEdit::Justif() { // TODO check if good - i += m_engine->GetText()->Justify(m_text+i, m_fontType, + i += m_engine->GetText()->Justify(m_text.data()+i, m_fontType, m_fontSize, width); } else @@ -3009,7 +2982,7 @@ void CEdit::Justif() else { // TODO check if good - i += m_engine->GetText()->Justify(std::string(m_text+i), + i += m_engine->GetText()->Justify(std::string(m_text.data()+i), m_format.begin() + i, m_format.end(), size, @@ -3117,8 +3090,7 @@ void CEdit::UndoFlush() for ( i=0 ; i=1 ; i-- ) { @@ -3149,8 +3120,7 @@ void CEdit::UndoMemorize(OperUndo oper) len = m_len; if ( len == 0 ) len ++; - m_undo[0].text = new char[len+1]; - memcpy(m_undo[0].text, m_text, m_len); + m_undo[0].text = m_text; m_undo[0].len = m_len; m_undo[0].cursor1 = m_cursor1; @@ -3164,10 +3134,10 @@ bool CEdit::UndoRecall() { int i; - if ( m_undo[0].text == nullptr ) return false; + if ( m_undo[0].text.empty() ) return false; m_len = m_undo[0].len; - memcpy(m_text, m_undo[0].text, m_len); + m_text = m_undo[0].text; m_cursor1 = m_undo[0].cursor1; m_cursor2 = m_undo[0].cursor2; @@ -3177,7 +3147,7 @@ bool CEdit::UndoRecall() { m_undo[i] = m_undo[i+1]; } - m_undo[EDITUNDOMAX-1].text = nullptr; + m_undo[EDITUNDOMAX-1].text.clear(); m_bUndoForce = true; Justif(); diff --git a/src/ui/edit.h b/src/ui/edit.h index 385ee2b6..fa543d7e 100644 --- a/src/ui/edit.h +++ b/src/ui/edit.h @@ -67,7 +67,7 @@ const int EDITUNDOMAX = 20; struct EditUndo { //! original text - char* text; + std::vector text; //! length of the text int len; //! offset cursor @@ -248,7 +248,7 @@ protected: CScroll* m_scroll; // vertical scrollbar on the right int m_maxChar; // max length of the buffer m_text - char* m_text; // text (without zero terminator) + std::vector m_text; // text (without zero terminator) std::vector m_format; // format characters int m_len; // length used in m_text int m_cursor1; // offset cursor