return (n == 0) ? 1 : n;
}
+char *itoa (char *str, unsigned u, unsigned int sz)
+{
+ unsigned int i = (sz == 0 ) ? nextpow (u, 10) : sz;
+ char *s = str;
+ while (i > 0) {
+ str[i - 1] = '0' + (u % 10);
+ u /= 10;
+ i--;
+ s++;
+ }
+ return s;
+}
+
+double tenpower(int n)
+{
+ double t = 1.0;
+ int i;
+ for (i = 0; i < n; i++) {
+ t *= 10;
+ }
+ for (i = 0; i > n; i--) {
+ t /= 10;
+ }
+ return t;
+}
+
+int getexponant (double *f, int maxexp)
+{
+ int exp = 0;
+ while (*f > 10) {
+ *f /= 10;
+ exp++;
+ }
+ while (*f < 1) {
+ *f *= 10;
+ exp--;
+ }
+ *f += tenpower (maxexp - 1);
+ if (*f >= 10) {
+ *f /= 10;
+ exp++;
+ }
+
+ return exp;
+}
/* simple fprintf function */
int fdprintf (int fd, const char *fmt, ...)
va_start (ap, fmt);
while (*fmt) {
char *s;
+ double f = 0.0;
int d = 0;
unsigned int u;
char c = *fmt++;
*str++ = c;
} else {
int t = 0;
- char w = '0';
+ char w = '0';
int i, sz = 0;
void *p = NULL;
/* process format char */
switch (*fmt++) {
+ case '%': /* percent */
+ *str++ = '%';
+ break;
case 'c': /* char */
c = (char) va_arg (ap, int);
*str++ = c;
t = 1;
/* fall through */
case 'u': /* unsigned int */
- u = (t) ? (unsigned int)d : va_arg (ap, unsigned int);
- for (i = nextpow (u, 10), s = str; i > 0; i--, s++) {
- str[i - 1] = '0' + (u % 10);
- u /= 10;
+ str = itoa (str, (t) ? (unsigned int)d : va_arg (ap, unsigned int), 0);
+ break;
+ case 'f': /* float */
+ f = va_arg (ap, double);
+ if (f == 0) {
+ *str++ = '0';
+ break;
+ }
+ if (f < 0) {
+ *str++ = '-';
+ f = -f;
+ }
+ if (sz == 0) sz = 6;
+ t = getexponant (&f, -sz);
+ u = (int)f;
+ str = itoa (str, u, 0);
+ d = (int)((f - u) * tenpower (sz));
+ if (d > 0) {
+ *str++ = '.';
+ str = itoa (str, d, sz);
+ }
+ while (*(str - 1) == '0') {
+ str--;
+ }
+ if (t != 0) {
+ *str++ = 'e';
+ if (t < 0) {
+ *str++ = '-';
+ t = -t;
+ }
+ str = itoa (str, t, 0);
}
- str = s;
break;
case 'p': /* pointer */
*str++ = '0';