/* -*-c-*-
*
- * $Id: dputf.c,v 1.1 1999/10/04 21:44:47 mdw Exp $
+ * $Id: dputf.c,v 1.4 2001/06/22 19:35:29 mdw Exp $
*
* `printf'-style formatting for dynamic strings
*
/*----- Revision history --------------------------------------------------*
*
* $Log: dputf.c,v $
+ * Revision 1.4 2001/06/22 19:35:29 mdw
+ * Find out whether @<float.h>@ exists (hack for uC-Linux).
+ *
+ * Revision 1.3 2001/01/20 12:06:01 mdw
+ * Define flags with macros, to ensure unsignedness.
+ *
+ * Revision 1.2 2000/08/15 21:26:45 mdw
+ * (dstr_vputf): Don't try calling @va_arg@ on things @char@-sized.
+ *
* Revision 1.1 1999/10/04 21:44:47 mdw
* Move `dstr_putf' and `dstr_vputf' into a separate source file.
*
/*----- Header files ------------------------------------------------------*/
#include <ctype.h>
-#include <float.h>
#include <math.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#ifdef HAVE_FLOAT_H
+# include <float.h>
+#endif
+
#include "dstr.h"
/*----- Tunable constants -------------------------------------------------*/
unsigned f;
int wd, prec;
- enum {
- f_short = 1,
- f_long = 2,
- f_Long = 4,
- f_wd = 8,
- f_prec = 16
- };
+#define f_short 1u
+#define f_long 2u
+#define f_Long 4u
+#define f_wd 8u
+#define f_prec 16u
/* --- Most stuff gets passed on through --- */
goto formatted;
case 'e': case 'E': case 'f': case 'F': case 'g': case 'G':
+#ifdef HAVE_FLOAT_H
DPUTC(&dd, *p);
DPUTZ(&dd);
if (*p == 'f') {
if (mx > sz)
sz = mx;
}
- if ((f & f_prec) == 0)
+ if (!(f & f_prec))
prec = 6;
- if ((f & f_prec))
+ else
sz += prec + 16;
if ((f & f_wd) && wd + 1 > sz)
sz = wd + 1;
d->len += sprintf(d->buf + d->len, dd.buf,
va_arg(ap, double));
goto formatted;
+#else
+ DPUTS(d, "<no float support>");
+#endif
case 'c':
DPUTC(&dd, *p);
sz = wd + 1;
DENSURE(d, sz);
d->len += sprintf(d->buf + d->len, dd.buf,
- va_arg(ap, unsigned char));
+ va_arg(ap, unsigned));
goto formatted;
case 's': {
formatted:
DRESET(&dd);
q = ++p;
+
+#undef f_short
+#undef f_long
+#undef f_Long
+#undef f_wd
+#undef f_prec
}
DPUTM(d, q, p - q);