From 4cfa766c6e2aa22a0d1e90cfe71a1a8ff2142a0f Mon Sep 17 00:00:00 2001
From: BogDan Vatra <bogdan@kde.org>
Date: Sun, 28 Dec 2014 00:17:47 +0200
Subject: [PATCH 06/11] Fix crappy vswprintf implemenation on Android.
It was the main reason for most of the crashes (e.g. sound).
---
source/gui/GUIbase.cpp | 6 +++---
source/gui/GUIutil.cpp | 18 +++++++++---------
source/lib/secure_crt.cpp | 18 ++++++++++++++++++
source/ps/Overlay.cpp | 6 +++---
source/ps/TouchInput.cpp | 2 +-
5 files changed, 34 insertions(+), 16 deletions(-)
diff --git a/source/gui/GUIbase.cpp b/source/gui/GUIbase.cpp
index 3a65bd1..a2e505c 100644
a
|
b
|
bool CClientArea::SetClientArea(const CStr& Value)
|
113 | 113 | coord++; |
114 | 114 | break; |
115 | 115 | default: |
116 | | LOGWARNING(L"ClientArea definitions may only contain numerics. Your input: '%s'", Value.c_str()); |
| 116 | LOGWARNING(L"ClientArea definitions may only contain numerics. Your input: '%hs'", Value.c_str()); |
117 | 117 | return false; |
118 | 118 | } |
119 | 119 | if (coord > 3) |
120 | 120 | { |
121 | | LOGWARNING(L"Too many CClientArea parameters (4 max). Your input: '%s'", Value.c_str()); |
| 121 | LOGWARNING(L"Too many CClientArea parameters (4 max). Your input: '%hs'", Value.c_str()); |
122 | 122 | return false; |
123 | 123 | } |
124 | 124 | } |
125 | 125 | |
126 | 126 | if (coord < 3) |
127 | 127 | { |
128 | | LOGWARNING(L"Too few CClientArea parameters (4 min). Your input: '%s'", Value.c_str()); |
| 128 | LOGWARNING(L"Too few CClientArea parameters (4 min). Your input: '%hs'", Value.c_str()); |
129 | 129 | return false; |
130 | 130 | } |
131 | 131 | |
diff --git a/source/gui/GUIutil.cpp b/source/gui/GUIutil.cpp
index d41f5b9..96a8ab5 100644
a
|
b
|
bool __ParseString<CRect>(const CStrW& Value, CRect &Output)
|
69 | 69 | { |
70 | 70 | if (stream.eof()) |
71 | 71 | { |
72 | | LOGWARNING(L"Too few CRect parameters (min %i). Your input: '%s'", NUM_COORDS, Value.ToUTF8().c_str()); |
| 72 | LOGWARNING(L"Too few CRect parameters (min %i). Your input: '%hs'", NUM_COORDS, Value.ToUTF8().c_str()); |
73 | 73 | return false; |
74 | 74 | } |
75 | 75 | stream >> coords[i]; |
76 | 76 | if ((stream.rdstate() & std::wstringstream::failbit) != 0) |
77 | 77 | { |
78 | | LOGWARNING(L"Unable to parse CRect parameters. Your input: '%s'", Value.ToUTF8().c_str()); |
| 78 | LOGWARNING(L"Unable to parse CRect parameters. Your input: '%hs'", Value.ToUTF8().c_str()); |
79 | 79 | return false; |
80 | 80 | } |
81 | 81 | } |
82 | 82 | |
83 | 83 | if (!stream.eof()) |
84 | 84 | { |
85 | | LOGWARNING(L"Too many CRect parameters (max %i). Your input: '%s'", NUM_COORDS, Value.ToUTF8().c_str()); |
| 85 | LOGWARNING(L"Too many CRect parameters (max %i). Your input: '%hs'", NUM_COORDS, Value.ToUTF8().c_str()); |
86 | 86 | return false; |
87 | 87 | } |
88 | 88 | |
… |
… |
bool __ParseString<CSize>(const CStrW& Value, CSize &Output)
|
134 | 134 | { |
135 | 135 | if (stream.eof()) |
136 | 136 | { |
137 | | LOGWARNING(L"Too few CSize parameters (min %i). Your input: '%s'", NUM_COORDS, Value.ToUTF8().c_str()); |
| 137 | LOGWARNING(L"Too few CSize parameters (min %i). Your input: '%hs'", NUM_COORDS, Value.ToUTF8().c_str()); |
138 | 138 | return false; |
139 | 139 | } |
140 | 140 | stream >> coords[i]; |
141 | 141 | if ((stream.rdstate() & std::wstringstream::failbit) != 0) |
142 | 142 | { |
143 | | LOGWARNING(L"Unable to parse CSize parameters. Your input: '%s'", Value.ToUTF8().c_str()); |
| 143 | LOGWARNING(L"Unable to parse CSize parameters. Your input: '%hs'", Value.ToUTF8().c_str()); |
144 | 144 | return false; |
145 | 145 | } |
146 | 146 | } |
… |
… |
bool __ParseString<CSize>(const CStrW& Value, CSize &Output)
|
150 | 150 | |
151 | 151 | if (!stream.eof()) |
152 | 152 | { |
153 | | LOGWARNING(L"Too many CSize parameters (max %i). Your input: '%s'", NUM_COORDS, Value.ToUTF8().c_str()); |
| 153 | LOGWARNING(L"Too many CSize parameters (max %i). Your input: '%hs'", NUM_COORDS, Value.ToUTF8().c_str()); |
154 | 154 | return false; |
155 | 155 | } |
156 | 156 | |
… |
… |
bool __ParseString<CPos>(const CStrW& Value, CPos &Output)
|
169 | 169 | { |
170 | 170 | if (stream.eof()) |
171 | 171 | { |
172 | | LOGWARNING(L"Too few CPos parameters (min %i). Your input: '%s'", NUM_COORDS, Value.ToUTF8().c_str()); |
| 172 | LOGWARNING(L"Too few CPos parameters (min %i). Your input: '%hs'", NUM_COORDS, Value.ToUTF8().c_str()); |
173 | 173 | return false; |
174 | 174 | } |
175 | 175 | stream >> coords[i]; |
176 | 176 | if ((stream.rdstate() & std::wstringstream::failbit) != 0) |
177 | 177 | { |
178 | | LOGWARNING(L"Unable to parse CPos parameters. Your input: '%s'", Value.ToUTF8().c_str()); |
| 178 | LOGWARNING(L"Unable to parse CPos parameters. Your input: '%hs'", Value.ToUTF8().c_str()); |
179 | 179 | return false; |
180 | 180 | } |
181 | 181 | } |
… |
… |
bool __ParseString<CPos>(const CStrW& Value, CPos &Output)
|
185 | 185 | |
186 | 186 | if (!stream.eof()) |
187 | 187 | { |
188 | | LOGWARNING(L"Too many CPos parameters (max %i). Your input: '%s'", NUM_COORDS, Value.ToUTF8().c_str()); |
| 188 | LOGWARNING(L"Too many CPos parameters (max %i). Your input: '%hs'", NUM_COORDS, Value.ToUTF8().c_str()); |
189 | 189 | return false; |
190 | 190 | } |
191 | 191 | |
diff --git a/source/lib/secure_crt.cpp b/source/lib/secure_crt.cpp
index 849c76e..6b7be9a 100644
a
|
b
|
|
32 | 32 | |
33 | 33 | #include "lib/secure_crt.h" |
34 | 34 | |
| 35 | #if OS_ANDROID |
| 36 | # include <boost/algorithm/string/replace.hpp> |
| 37 | #endif |
| 38 | |
35 | 39 | // we were included from wsecure_crt.cpp; skip all stuff that |
36 | 40 | // must only be done once. |
37 | 41 | #ifndef WSECURE_CRT |
… |
… |
size_t tnlen(const tchar* str, size_t max_len)
|
127 | 131 | } |
128 | 132 | #endif // !OS_UNIX |
129 | 133 | |
| 134 | #if OS_ANDROID |
| 135 | static std::wstring androidFormat(const tchar *fmt) |
| 136 | { |
| 137 | std::wstring ret(fmt); |
| 138 | boost::algorithm::replace_all(ret, L"%ls", L"%S"); |
| 139 | boost::algorithm::replace_all(ret, L"%hs", L"%s"); |
| 140 | return std::move(ret); |
| 141 | } |
| 142 | #endif |
130 | 143 | |
131 | 144 | // copy at most <max_src_chars> (not including trailing null) from |
132 | 145 | // <src> into <dst>, which must not overlap. |
… |
… |
int tvsprintf_s(tchar* dst, size_t max_dst_chars, const tchar* fmt, va_list ap)
|
236 | 249 | return -1; |
237 | 250 | } |
238 | 251 | |
| 252 | #if OS_ANDROID |
| 253 | memset(dst, 0, max_dst_chars * sizeof(tchar)); |
| 254 | const int ret = tvsnprintf(dst, max_dst_chars, androidFormat(fmt).c_str(), ap); |
| 255 | #else |
239 | 256 | const int ret = tvsnprintf(dst, max_dst_chars, fmt, ap); |
| 257 | #endif |
240 | 258 | if(ret >= int(max_dst_chars)) // not enough space |
241 | 259 | { |
242 | 260 | dst[0] = '\0'; |
diff --git a/source/ps/Overlay.cpp b/source/ps/Overlay.cpp
index 4555231..30145d6 100644
a
|
b
|
bool CColor::ParseString(const CStr8& Value, int DefaultAlpha)
|
48 | 48 | stream >> values[i]; |
49 | 49 | if ((stream.rdstate() & std::stringstream::failbit) != 0) |
50 | 50 | { |
51 | | LOGWARNING(L"Unable to parse CColor parameters. Your input: '%s'", Value.c_str()); |
| 51 | LOGWARNING(L"Unable to parse CColor parameters. Your input: '%hs'", Value.c_str()); |
52 | 52 | return false; |
53 | 53 | } |
54 | 54 | if (values[i] < 0 || values[i] > 255) |
… |
… |
bool CColor::ParseString(const CStr8& Value, int DefaultAlpha)
|
60 | 60 | |
61 | 61 | if (i < 3) |
62 | 62 | { |
63 | | LOGWARNING(L"Not enough parameters when parsing as CColor. Your input: '%s'", Value.c_str()); |
| 63 | LOGWARNING(L"Not enough parameters when parsing as CColor. Your input: '%hs'", Value.c_str()); |
64 | 64 | return false; |
65 | 65 | } |
66 | 66 | if (!stream.eof()) |
67 | 67 | { |
68 | | LOGWARNING(L"Too many parameters when parsing as CColor. Your input: '%s'", Value.c_str()); |
| 68 | LOGWARNING(L"Too many parameters when parsing as CColor. Your input: '%hs'", Value.c_str()); |
69 | 69 | return false; |
70 | 70 | } |
71 | 71 | |
diff --git a/source/ps/TouchInput.cpp b/source/ps/TouchInput.cpp
index ab239e7..e96da2b 100644
a
|
b
|
InReaction CTouchInput::HandleEvent(const SDL_Event_* ev)
|
270 | 270 | case SDL_FINGERMOTION: |
271 | 271 | { |
272 | 272 | // Map finger events onto the mouse, for basic testing |
273 | | debug_printf(L"finger %s tid=%lld fid=%lld x=%f y=%f dx=%f dy=%f p=%f\n", |
| 273 | debug_printf(L"finger %hs tid=%lld fid=%lld x=%f y=%f dx=%f dy=%f p=%f\n", |
274 | 274 | ev->ev.type == SDL_FINGERDOWN ? "down" : |
275 | 275 | ev->ev.type == SDL_FINGERUP ? "up" : |
276 | 276 | ev->ev.type == SDL_FINGERMOTION ? "motion" : "?", |