socsvn commit: r269341 - soc2014/pedrosouza/lua_loader/head/sys/lua/src
pedrosouza at FreeBSD.org
pedrosouza at FreeBSD.org
Tue Jun 10 00:33:33 UTC 2014
Author: pedrosouza
Date: Tue Jun 10 00:33:31 2014
New Revision: 269341
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=269341
Log:
Improve dtostr function
Modified:
soc2014/pedrosouza/lua_loader/head/sys/lua/src/lstd.c
soc2014/pedrosouza/lua_loader/head/sys/lua/src/lstd.h
Modified: soc2014/pedrosouza/lua_loader/head/sys/lua/src/lstd.c
==============================================================================
--- soc2014/pedrosouza/lua_loader/head/sys/lua/src/lstd.c Mon Jun 9 23:11:50 2014 (r269340)
+++ soc2014/pedrosouza/lua_loader/head/sys/lua/src/lstd.c Tue Jun 10 00:33:31 2014 (r269341)
@@ -170,49 +170,96 @@
return ret * exp_m;
}
-char * dtostr(double value, char * buf)
+int dtostr(double v, char * str)
{
- int c, i;
+ int exp = 0;
+ int i;
+ long long n;
+ double e = 1;
+ char * ptr;
char tmp[20];
- char *ptr, *bb = buf;
- long long num = (long long) value;
- double frac = value - num;
+ char *buf = str;
- tmp[19] = 0;
- ptr = &tmp[19];
- while (num > 0)
+ if (v < 0)
{
- c = num % 10;
- num = num / 10;
- *(--ptr) = '0' + c;
+ *buf++ = '-';
+ v = -v;
}
- if (ptr == &tmp[19])
- *buf++ = '0';
- else
+ if (v <= e)
{
- while (*ptr)
+ while (v < e)
{
- *buf++ = *ptr++;
+ --exp;
+ e *= 0.1;
}
+ } else
+ {
+ while (v > e)
+ {
+ ++exp;
+ e *= 10;
+ }
+ --exp;
+ e /= 10;
}
- if (abs(frac) > 0.0000001)
+ if (exp > 9 || exp < -9)
+ {
+ v /= e;
+ } else
+ {
+ exp = 0;
+ }
+
+ n = (long long)v;
+ v -= n;
+ ptr = &tmp[19];
+ *ptr = 0;
+
+ do
{
- *buf++ = 0;
- return bb;
- } else
+ i = n % 10;
+ n /= 10;
+ *(--ptr) = i + '0';
+ } while (n > 0);
+
+ while (*ptr != 0) *buf++ = *ptr++;
+
+ if (v != 0)
{
+ ptr = buf;
*buf++ = '.';
- for (i = 0; i < 7; ++i)
+ for (i = 0; i < 17; ++i)
+ {
+ v *= 10;
+ n = (long long)v;
+ *buf++ = '0' + n;
+ ptr = n > 0 ? buf : ptr;
+ v -= n;
+ }
+ buf = ptr;
+ }
+
+ if (exp != 0)
+ {
+ *buf++ = 'e';
+ if (exp < 0)
+ {
+ *buf++ = '-';
+ exp = -exp;
+ }
+ ptr = &tmp[19];
+ *ptr = 0;
+ while (exp > 0)
{
- frac *= 10;
- c = (long long)frac;
- *buf++ = '0' + c;
- frac -= c;
+ i = exp % 10;
+ exp /= 10;
+ *(--ptr) = '0' + i;
}
- *buf = 0;
+ while (*ptr != 0) *buf++ = *ptr++;
}
- return bb;
+ *buf = 0;
+ return buf - str;
}
#endif //BOOT_LUA
\ No newline at end of file
Modified: soc2014/pedrosouza/lua_loader/head/sys/lua/src/lstd.h
==============================================================================
--- soc2014/pedrosouza/lua_loader/head/sys/lua/src/lstd.h Mon Jun 9 23:11:50 2014 (r269340)
+++ soc2014/pedrosouza/lua_loader/head/sys/lua/src/lstd.h Tue Jun 10 00:33:31 2014 (r269341)
@@ -57,7 +57,7 @@
double strtod(const char *string, char **endPtr);
-char * dtostr(double value, char * buf);
+int dtostr(double v, char * str);
#endif
#endif //LSTD_H
More information about the svn-soc-all
mailing list