[Scummvm-git-logs] scummvm master -> 3fc822e55c19f86d59aa33e8c33fa42d7343cbc5

phcoder phcoder at gmail.com
Sun Nov 1 21:53:07 UTC 2020


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
3fc822e55c COMMON: introduce substr for U32String (#2585)


Commit: 3fc822e55c19f86d59aa33e8c33fa42d7343cbc5
    https://github.com/scummvm/scummvm/commit/3fc822e55c19f86d59aa33e8c33fa42d7343cbc5
Author: Vladimir Serbinenko (phcoder at google.com)
Date: 2020-11-01T22:53:03+01:00

Commit Message:
COMMON: introduce substr for U32String (#2585)

It's safer than direct array manipulation. Replace current uses
of subsetting with substr.

Changed paths:
    common/ustr.cpp
    common/ustr.h
    engines/ultima/ultima8/graphics/fonts/tt_font.cpp
    engines/wintermute/base/font/base_font_truetype.cpp
    engines/wintermute/base/scriptables/script_ext_string.cpp
    graphics/macgui/macmenu.cpp
    graphics/macgui/mactext.cpp
    graphics/macgui/mactextwindow.cpp


diff --git a/common/ustr.cpp b/common/ustr.cpp
index 5e8fc0e39d..d7bda71dc3 100644
--- a/common/ustr.cpp
+++ b/common/ustr.cpp
@@ -131,6 +131,15 @@ U32String operator+(const U32String &x, const U32String::value_type y) {
 	return temp;
 }
 
+U32String U32String::substr(size_t pos, size_t len) const {
+	if (pos >= _size)
+		return U32String();
+	else if (len == npos)
+		return U32String(_str + pos);
+	else
+		return U32String(_str + pos, MIN((size_t)_size - pos, len));
+}
+
 void U32String::insertString(const char *s, uint32 p) {
 	while (*s != '\0') {
 		BaseString<u32char_type_t>::insertChar(*s++, p++);
diff --git a/common/ustr.h b/common/ustr.h
index f145ec655e..76acc80fc0 100644
--- a/common/ustr.h
+++ b/common/ustr.h
@@ -139,6 +139,9 @@ public:
 	void insertString(const char *s, uint32 p);
 	void insertString(const String &s, uint32 p);
 
+    	/** Return a substring of this string */
+	U32String substr(size_t pos = 0, size_t len = npos) const;
+
 	const uint32 *u32_str() const {
 		return (const uint32 *) _str;
 	}
diff --git a/engines/ultima/ultima8/graphics/fonts/tt_font.cpp b/engines/ultima/ultima8/graphics/fonts/tt_font.cpp
index f5acca558a..0780fe16a4 100644
--- a/engines/ultima/ultima8/graphics/fonts/tt_font.cpp
+++ b/engines/ultima/ultima8/graphics/fonts/tt_font.cpp
@@ -252,7 +252,7 @@ RenderedText *TTFont::renderText(const Std::string &text, unsigned int &remainin
 
 		if (iter->_cursor != Std::string::npos) {
 			assert(iter->_cursor <= iter->_text.size());
-			unicodeText = Common::U32String(unicodeText.c_str(), iter->_cursor);
+			unicodeText = unicodeText.substr(0, iter->_cursor);
 
 			int w = _ttfFont->getStringWidth(unicodeText);
 
diff --git a/engines/wintermute/base/font/base_font_truetype.cpp b/engines/wintermute/base/font/base_font_truetype.cpp
index 6a5605feaa..a5a5c10155 100644
--- a/engines/wintermute/base/font/base_font_truetype.cpp
+++ b/engines/wintermute/base/font/base_font_truetype.cpp
@@ -121,7 +121,7 @@ int BaseFontTT::getTextWidth(const byte *text, int maxLength) {
 	}
 
 	if (maxLength >= 0 && textStr.size() > (uint32)maxLength) {
-		textStr = WideString(textStr.c_str(), (uint32)maxLength);
+		textStr = textStr.substr(0, (uint32)maxLength);
 	}
 	//text = text.substr(0, MaxLength); // TODO: Remove
 
@@ -167,7 +167,7 @@ void BaseFontTT::drawText(const byte *text, int x, int y, int width, TTextAlign
 	}
 
 	if (maxLength >= 0 && textStr.size() > (uint32)maxLength) {
-		textStr = WideString(textStr.c_str(), (uint32)maxLength);
+		textStr = textStr.substr(0, (uint32)maxLength);
 	}
 	//text = text.substr(0, MaxLength); // TODO: Remove
 
diff --git a/engines/wintermute/base/scriptables/script_ext_string.cpp b/engines/wintermute/base/scriptables/script_ext_string.cpp
index a4f05dc4e5..ef842a0a6f 100644
--- a/engines/wintermute/base/scriptables/script_ext_string.cpp
+++ b/engines/wintermute/base/scriptables/script_ext_string.cpp
@@ -128,8 +128,7 @@ bool SXString::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 			str = StringUtil::ansiToWide(_string);
 		}
 
-		//WideString subStr = str.substr(start, end - start + 1);
-		WideString subStr(str.c_str() + start, end - start + 1);
+		WideString subStr = str.substr(start, end - start + 1);
 
 		if (_gameRef->_textEncoding == TEXT_UTF8) {
 			stack->pushString(StringUtil::wideToUtf8(subStr).c_str());
@@ -170,8 +169,7 @@ bool SXString::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 			str = StringUtil::ansiToWide(_string);
 		}
 
-//			WideString subStr = str.substr(start, len);
-		WideString subStr(str.c_str() + start, len);
+		WideString subStr = str.substr(start, len);
 
 		if (_gameRef->_textEncoding == TEXT_UTF8) {
 			stack->pushString(StringUtil::wideToUtf8(subStr).c_str());
@@ -323,7 +321,7 @@ bool SXString::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 			uint32 ch = (i == str.size()) ? '\0' : str[i];
 			if (ch =='\0' || delims.contains(ch)) {
 				if (i != start) {
-					parts.push_back(WideString(str.c_str() + start, i - start));
+					parts.push_back(str.substr(start, i - start));
 				} else {
 					parts.push_back(WideString());
 				}
diff --git a/graphics/macgui/macmenu.cpp b/graphics/macgui/macmenu.cpp
index 1653734674..d508359c6d 100644
--- a/graphics/macgui/macmenu.cpp
+++ b/graphics/macgui/macmenu.cpp
@@ -619,8 +619,8 @@ void MacMenu::processSubmenuTabs(MacMenuSubMenu *submenu) {
 
 			haveTabs = true;
 
-			Common::U32String start(item->unicodeText.c_str(), &item->unicodeText.c_str()[pos]);
-			Common::U32String end(&item->unicodeText.c_str()[pos + 1]);
+			Common::U32String start = item->unicodeText.substr(0, pos);
+			Common::U32String end = item->unicodeText.substr(pos + 1);
 
 			res = start;
 			res += Common::U32String("  ");
@@ -648,8 +648,8 @@ void MacMenu::processSubmenuTabs(MacMenuSubMenu *submenu) {
 		if (pos == Common::U32String::npos)
 			continue;
 
-		Common::U32String start(item->unicodeText.c_str(), &item->unicodeText.c_str()[pos]);
-		Common::U32String end(&item->unicodeText.c_str()[pos + 1]);
+		Common::U32String start = item->unicodeText.substr(0, pos);
+		Common::U32String end = item->unicodeText.substr(pos + 1);
 		Common::U32String res;
 		Common::U32String spaces(" ");
 		int width;
diff --git a/graphics/macgui/mactext.cpp b/graphics/macgui/mactext.cpp
index cb4d39a6db..4e0ee16a8a 100644
--- a/graphics/macgui/mactext.cpp
+++ b/graphics/macgui/mactext.cpp
@@ -614,7 +614,7 @@ int MacText::getLineWidth(int line, bool enforce, int col) {
 			if (col >= (int)_textLines[line].chunks[i].text.size()) {
 				col -= _textLines[line].chunks[i].text.size();
 			} else {
-				Common::U32String tmp(_textLines[line].chunks[i].text.c_str(), col);
+				Common::U32String tmp = _textLines[line].chunks[i].text.substr(0, col);
 
 				width += _textLines[line].chunks[i].getFont()->getStringWidth(tmp);
 
@@ -1053,7 +1053,7 @@ void MacText::setSelection(int pos, bool start) {
 			if (pos < getLineCharWidth(row)) {
 				for (uint i = 0; i < _textLines[row].chunks.size(); i++) {
 					if ((uint)pos < _textLines[row].chunks[i].text.size()) {
-						colX += _textLines[row].chunks[i].getFont()->getStringWidth(Common::U32String(_textLines[row].chunks[i].text.c_str(), pos));
+						colX += _textLines[row].chunks[i].getFont()->getStringWidth(_textLines[row].chunks[i].text.substr(0, pos));
 						col += pos + 1;
 						pos = 0;
 						break;
@@ -1439,10 +1439,10 @@ Common::U32String MacText::getTextChunk(int startRow, int startCol, int endRow,
 					if (endCol >= (int)_textLines[i].chunks[chunk].text.size())
 						res += _textLines[i].chunks[chunk].text;
 					else
-						res += Common::U32String(_textLines[i].chunks[chunk].text.c_str(), endCol);
+						res += _textLines[i].chunks[chunk].text.substr(0, endCol);
 				} else if ((int)_textLines[i].chunks[chunk].text.size() > startCol) {
 					ADDFORMATTING();
-					res += Common::U32String(_textLines[i].chunks[chunk].text.c_str() + startCol, endCol - startCol);
+					res += _textLines[i].chunks[chunk].text.substr(startCol, endCol - startCol);
 				}
 
 				startCol -= _textLines[i].chunks[chunk].text.size();
@@ -1462,7 +1462,7 @@ Common::U32String MacText::getTextChunk(int startRow, int startCol, int endRow,
 					res += _textLines[i].chunks[chunk].text;
 				} else if ((int)_textLines[i].chunks[chunk].text.size() > startCol) {
 					ADDFORMATTING();
-					res += Common::U32String(_textLines[i].chunks[chunk].text.c_str() + startCol);
+					res += _textLines[i].chunks[chunk].text.substr(startCol);
 				}
 
 				startCol -= _textLines[i].chunks[chunk].text.size();
@@ -1482,7 +1482,7 @@ Common::U32String MacText::getTextChunk(int startRow, int startCol, int endRow,
 				if (endCol >= (int)_textLines[i].chunks[chunk].text.size())
 					res += _textLines[i].chunks[chunk].text;
 				else
-					res += Common::U32String(_textLines[i].chunks[chunk].text.c_str(), endCol);
+					res += _textLines[i].chunks[chunk].text.substr(0, endCol);
 
 				endCol -= _textLines[i].chunks[chunk].text.size();
 
@@ -1605,8 +1605,8 @@ void MacText::addNewLine(int *row, int *col) {
 	MacFontRun newchunk = line->chunks[ch];
 	MacTextLine newline;
 
-	newchunk.text = &line->chunks[ch].text.c_str()[pos];
-	line->chunks[ch].text = Common::U32String(line->chunks[ch].text.c_str(), pos);
+	newchunk.text = line->chunks[ch].text.substr(pos);
+	line->chunks[ch].text = line->chunks[ch].text.substr(0, pos);
 	newline.chunks.push_back(newchunk);
 
 	for (uint i = ch + 1; i < line->chunks.size(); i++) {
diff --git a/graphics/macgui/mactextwindow.cpp b/graphics/macgui/mactextwindow.cpp
index b76bfc30ab..64cab16dba 100644
--- a/graphics/macgui/mactextwindow.cpp
+++ b/graphics/macgui/mactextwindow.cpp
@@ -286,7 +286,7 @@ Common::U32String MacTextWindow::cutSelection() {
 		return Common::U32String("");
 	}
 
-	Common::U32String newInput = Common::U32String(_inputText.c_str(), selPos) + Common::U32String(_inputText.c_str() + selPos + selection.size());
+	Common::U32String newInput = _inputText.substr(0, selPos) + _inputText.substr(selPos + selection.size());
 
 	clearSelection();
 	clearInput();




More information about the Scummvm-git-logs mailing list