7fe829 #common #bug: fix toUpper/toLower functions

Authored and Committed by bw 7 years ago
    #common #bug: fix toUpper/toLower functions
    
    Standard forbids modifying of data by string::c_str() pointer, in some
    case it's may affect other strings.
        
toonz/sources/common/tcore/tstring.cpp CHANGED
@@ -125,9 +125,12 @@ bool isDouble(std::wstring s) { return isDouble(::to_string(s)); }
125
125
126
126
std::string toUpper(std::string a) {
127
127
#ifdef _WIN32
128
- return _strupr(const_cast<char *>(a.c_str()));
128
+ size_t size = a.size();
129
+ const char* cstr = a.c_str();
130
+ std::vector<char> buf(cstr, cstr + size + 1);
131
+ return _strupr(&buf[0]);
129
132
#else
130
- std::string ret = a;
133
+ std::string ret(a);
131
134
for (int i = 0; i < (int)ret.length(); i++) ret[i] = toupper(ret[i]);
132
135
return ret;
133
136
#endif
@@ -135,9 +138,12 @@ std::string toUpper(std::string a) {
135
138
136
139
std::string toLower(std::string a) {
137
140
#ifdef _WIN32
138
- return _strlwr(const_cast<char *>(a.c_str()));
141
+ size_t size = a.size();
142
+ const char* cstr = a.c_str();
143
+ std::vector<char> buf(cstr, cstr + size + 1);
144
+ return _strlwr(&buf[0]);
139
145
#else
140
- std::string ret = a;
146
+ std::string ret(a);
141
147
for (int i = 0; i < (int)ret.length(); i++) ret[i] = tolower(ret[i]);
142
148
return ret;
143
149
#endif
@@ -145,27 +151,26 @@ std::string toLower(std::string a) {
145
151
146
152
std::wstring toUpper(std::wstring a) {
147
153
#ifdef _WIN32
148
- return _wcsupr(const_cast<wchar_t *>(a.c_str()));
154
+ size_t size = a.size();
155
+ const wchar_t* cstr = a.c_str();
156
+ std::vector<wchar_t> buf(cstr, cstr + size + 1);
157
+ return _wcsupr(&buf[0]);
149
158
#else
150
- std::wstring ret;
151
- for (int i = 0; i < (int)a.length(); i++) {
159
+ std::wstring ret(a);
160
+ for (int i = 0; i < (int)ret.length(); i++) ret[i] = towupper(ret[i]);
152
- wchar_t c = towupper(a[i]);
153
- ret += c;
154
- }
155
161
return ret;
156
162
#endif
157
163
}
158
164
159
165
std::wstring toLower(std::wstring a) {
160
166
#ifdef _WIN32
161
- return _wcslwr(const_cast<wchar_t *>(a.c_str()));
167
+ size_t size = a.size();
168
+ const wchar_t* cstr = a.c_str();
169
+ std::vector<wchar_t> buf(cstr, cstr + size + 1);
170
+ return _wcslwr(&buf[0]);
162
171
#else
163
- const int length = (int)a.length();
164
- std::wstring ret;
172
+ std::wstring ret(a);
173
+ for (int i = 0; i < (int)ret.length(); i++) ret[i] = towlower(ret[i]);
165
- ret.resize(length);
166
- for (int i = 0; i < length; i++) {
167
- ret[i] = towlower(a[i]);
168
- }
169
174
return ret;
170
175
#endif
171
176
}