summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2017-08-16 11:35:32 -0400
committerFranklin Wei <git@fwei.tk>2017-08-16 11:40:42 -0400
commitc78ff7f6153d2a787bfd8cb3410dff8db74b2789 (patch)
treee3a507a1a25640d4c8e2cbedc464d38e6af5575c /apps
parentbf25f3e6e7b1518b0dd499676ac298172dc25fa1 (diff)
downloadrockbox-c78ff7f6153d2a787bfd8cb3410dff8db74b2789.tar.gz
rockbox-c78ff7f6153d2a787bfd8cb3410dff8db74b2789.zip
puzzles: fix floating-point formatting
This is pretty ad-hoc, but the only other ways are to rewrite sprintf (which would use too much memory on the c200v2), or implement support for floats in rockbox's formatter, neither of which are acceptable. Change-Id: I70d59fd3e90a16e2db9ae0a84cd8c14807f50b46
Diffstat (limited to 'apps')
-rw-r--r--apps/plugins/puzzles/rbcompat.h1
-rw-r--r--apps/plugins/puzzles/rbwrappers.c6
-rw-r--r--apps/plugins/puzzles/src/midend.c2
-rw-r--r--apps/plugins/puzzles/src/net.c7
-rw-r--r--apps/plugins/puzzles/src/netslide.c7
-rw-r--r--apps/plugins/puzzles/src/rect.c7
6 files changed, 23 insertions, 7 deletions
diff --git a/apps/plugins/puzzles/rbcompat.h b/apps/plugins/puzzles/rbcompat.h
index 4bb9f39ca7..66c86f1cf4 100644
--- a/apps/plugins/puzzles/rbcompat.h
+++ b/apps/plugins/puzzles/rbcompat.h
@@ -15,6 +15,7 @@ double cos_wrapper(double rads);
15int vsprintf_wrapper(char *s, const char *fmt, va_list ap); 15int vsprintf_wrapper(char *s, const char *fmt, va_list ap);
16float fabs_wrapper(float n); 16float fabs_wrapper(float n);
17float floor_wrapper(float n); 17float floor_wrapper(float n);
18int ftoa(char *buf, int len, float f);
18 19
19float atan_wrapper(float x); 20float atan_wrapper(float x);
20float atan2_wrapper(float y, float x); 21float atan2_wrapper(float y, float x);
diff --git a/apps/plugins/puzzles/rbwrappers.c b/apps/plugins/puzzles/rbwrappers.c
index 95bc2fc5b1..2d857c1cc9 100644
--- a/apps/plugins/puzzles/rbwrappers.c
+++ b/apps/plugins/puzzles/rbwrappers.c
@@ -23,6 +23,12 @@ int puts_wrapper(const char *s)
23 return 0; 23 return 0;
24} 24}
25 25
26int ftoa(char *buf, int len, float f)
27{
28 /* biggest hack ever */
29 return rb->snprintf(buf, len, "%d.%06d", (int)f, (int)((f - (int)f)*1e6));
30}
31
26/* fixed-point wrappers */ 32/* fixed-point wrappers */
27static long lastphase = 0, lastsin = 0, lastcos = 0x7fffffff; 33static long lastphase = 0, lastsin = 0, lastcos = 0x7fffffff;
28 34
diff --git a/apps/plugins/puzzles/src/midend.c b/apps/plugins/puzzles/src/midend.c
index 2eb5ee93e8..6dbdd33905 100644
--- a/apps/plugins/puzzles/src/midend.c
+++ b/apps/plugins/puzzles/src/midend.c
@@ -1701,7 +1701,7 @@ void midend_serialise(midend *me,
1701 */ 1701 */
1702 if (me->ourgame->is_timed) { 1702 if (me->ourgame->is_timed) {
1703 char buf[80]; 1703 char buf[80];
1704 sprintf(buf, "%g", me->elapsed); 1704 ftoa(buf, 80, me->elapsed);
1705 wr("TIME", buf); 1705 wr("TIME", buf);
1706 } 1706 }
1707 1707
diff --git a/apps/plugins/puzzles/src/net.c b/apps/plugins/puzzles/src/net.c
index de51f82fd7..9289afb682 100644
--- a/apps/plugins/puzzles/src/net.c
+++ b/apps/plugins/puzzles/src/net.c
@@ -257,7 +257,10 @@ static char *encode_params(const game_params *params, int full)
257 if (params->wrapping) 257 if (params->wrapping)
258 ret[len++] = 'w'; 258 ret[len++] = 'w';
259 if (full && params->barrier_probability) 259 if (full && params->barrier_probability)
260 len += sprintf(ret+len, "b%g", params->barrier_probability); 260 {
261 len += sprintf(ret+len, "b");
262 len += ftoa(ret + len, 400, params->barrier_probability);
263 }
261 if (full && !params->unique) 264 if (full && !params->unique)
262 ret[len++] = 'a'; 265 ret[len++] = 'a';
263 assert(len < lenof(ret)); 266 assert(len < lenof(ret));
@@ -292,7 +295,7 @@ static config_item *game_configure(const game_params *params)
292 295
293 ret[3].name = "Barrier probability"; 296 ret[3].name = "Barrier probability";
294 ret[3].type = C_STRING; 297 ret[3].type = C_STRING;
295 sprintf(buf, "%g", params->barrier_probability); 298 ftoa(buf, 80, params->barrier_probability);
296 ret[3].sval = dupstr(buf); 299 ret[3].sval = dupstr(buf);
297 ret[3].ival = 0; 300 ret[3].ival = 0;
298 301
diff --git a/apps/plugins/puzzles/src/netslide.c b/apps/plugins/puzzles/src/netslide.c
index c56e1abd6a..663febc61a 100644
--- a/apps/plugins/puzzles/src/netslide.c
+++ b/apps/plugins/puzzles/src/netslide.c
@@ -241,7 +241,10 @@ static char *encode_params(const game_params *params, int full)
241 if (params->wrapping) 241 if (params->wrapping)
242 ret[len++] = 'w'; 242 ret[len++] = 'w';
243 if (full && params->barrier_probability) 243 if (full && params->barrier_probability)
244 len += sprintf(ret+len, "b%g", params->barrier_probability); 244 {
245 len += sprintf(ret+len, "b");
246 len += ftoa(ret + len, 400, params->barrier_probability);
247 }
245 /* Shuffle limit is part of the limited parameters, because we have to 248 /* Shuffle limit is part of the limited parameters, because we have to
246 * provide the target move count. */ 249 * provide the target move count. */
247 if (params->movetarget) 250 if (params->movetarget)
@@ -278,7 +281,7 @@ static config_item *game_configure(const game_params *params)
278 281
279 ret[3].name = "Barrier probability"; 282 ret[3].name = "Barrier probability";
280 ret[3].type = C_STRING; 283 ret[3].type = C_STRING;
281 sprintf(buf, "%g", params->barrier_probability); 284 ftoa(buf, 80, params->barrier_probability);
282 ret[3].sval = dupstr(buf); 285 ret[3].sval = dupstr(buf);
283 ret[3].ival = 0; 286 ret[3].ival = 0;
284 287
diff --git a/apps/plugins/puzzles/src/rect.c b/apps/plugins/puzzles/src/rect.c
index 465e1436fa..0c06c74945 100644
--- a/apps/plugins/puzzles/src/rect.c
+++ b/apps/plugins/puzzles/src/rect.c
@@ -163,7 +163,10 @@ static char *encode_params(const game_params *params, int full)
163 163
164 sprintf(data, "%dx%d", params->w, params->h); 164 sprintf(data, "%dx%d", params->w, params->h);
165 if (full && params->expandfactor) 165 if (full && params->expandfactor)
166 sprintf(data + strlen(data), "e%g", params->expandfactor); 166 {
167 sprintf(data + strlen(data), "e");
168 ftoa(data + strlen(data), 256, params->expandfactor);
169 }
167 if (full && !params->unique) 170 if (full && !params->unique)
168 strcat(data, "a"); 171 strcat(data, "a");
169 172
@@ -191,7 +194,7 @@ static config_item *game_configure(const game_params *params)
191 194
192 ret[2].name = "Expansion factor"; 195 ret[2].name = "Expansion factor";
193 ret[2].type = C_STRING; 196 ret[2].type = C_STRING;
194 sprintf(buf, "%g", params->expandfactor); 197 ftoa(buf, 80, params->expandfactor);
195 ret[2].sval = dupstr(buf); 198 ret[2].sval = dupstr(buf);
196 ret[2].ival = 0; 199 ret[2].ival = 0;
197 200