|
@@ -60,12 +60,14 @@
|
|
|
* Manuel Novoa III Jan 2000
|
|
|
*
|
|
|
* Removed fake file from *s*printf functions because of possible problems
|
|
|
- * if called recursively. Instead, have sprintf, snprintf, and vsprintf
|
|
|
- * call vsnprintf which allocates a fake file on the stack.
|
|
|
- *
|
|
|
+ * if called recursively. Instead, have sprintf, snprintf, and vsprintf
|
|
|
+ * call vsnprintf which allocates a fake file on the stack.
|
|
|
+ * Removed WANT_FPUTC option. Always use standard putc macro to avoid
|
|
|
+ * problems with the fake file used by the *s*printf functions.
|
|
|
* Added asprintf.
|
|
|
- *
|
|
|
- * Hopefully fixed 0-pad prefixing bug.
|
|
|
+ * Fixed 0-pad prefixing bug.
|
|
|
+ * Converted sizeof(int) == sizeof(long) tests to compile time vs run time.
|
|
|
+ * This saves 112 bytes of code on i386.
|
|
|
*/
|
|
|
|
|
|
|
|
@@ -74,8 +76,8 @@
|
|
|
|
|
|
*
|
|
|
* 1) Normal (or partial for doubles) output support. Set to 1 to turn on.
|
|
|
- * Adds about 54 byes and about 217 bytes for long longss to the base size
|
|
|
- * of 1298. (Bizarre: both turned on is smaller than WANT_LONG_LONG only.)
|
|
|
+ * Adds about 70 bytes for doubles, about 220 bytes for long longs,
|
|
|
+ * and about 275 for both to the base code size of 1163 on i386.
|
|
|
*/
|
|
|
|
|
|
#define WANT_LONG_LONG 0
|
|
@@ -84,8 +86,9 @@
|
|
|
|
|
|
* appropriate size is removed from the arglist, and processing
|
|
|
* continues. This is adds less code and may be useful in some
|
|
|
- * cases. Set to 1 to turn on. Adds about 31 bytes for doubles
|
|
|
- * and about 54 bytes for long longs to the base size of 1298.
|
|
|
+ * cases. Set to 1 to turn on. Adds about 50 bytes for doubles,
|
|
|
+ * about 140 bytes for long longs, and about 175 bytes for both
|
|
|
+ * to the base code size of 1163 on i386.
|
|
|
*/
|
|
|
|
|
|
#define WANT_LONG_LONG_ERROR 0
|
|
@@ -100,20 +103,13 @@
|
|
|
|
|
|
#define WANT_GNU_ERRNO 0
|
|
|
|
|
|
-
|
|
|
- * Use fputc instead of macro putc. Slower but saves about 36 bytes.
|
|
|
- * WARNING! This may cause problems the the *s*printf functions!
|
|
|
- * Don't enable at this time. Manuel
|
|
|
- */
|
|
|
-
|
|
|
-#define WANT_FPUTC 0
|
|
|
-
|
|
|
|
|
|
|
|
|
#include <sys/types.h>
|
|
|
#include <fcntl.h>
|
|
|
#include <string.h>
|
|
|
#include <stdlib.h>
|
|
|
+#include <limits.h>
|
|
|
|
|
|
#if WANT_GNU_ERRNO
|
|
|
#include <errno.h>
|
|
@@ -129,12 +125,6 @@
|
|
|
|
|
|
#include "stdio.h"
|
|
|
|
|
|
-#if WANT_FPUTC
|
|
|
-#undef putc
|
|
|
-#define putc(c,s) fputc(c,s)
|
|
|
-#endif
|
|
|
-
|
|
|
-
|
|
|
extern int vfnprintf(FILE * op, size_t max_size,
|
|
|
register __const char *fmt, register va_list ap);
|
|
|
|
|
@@ -226,6 +216,15 @@ int vprintf(const char *fmt, va_list ap)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+#ifdef L_vfprintf
|
|
|
+
|
|
|
+int vfprintf(FILE * op, register __const char *fmt, register va_list ap)
|
|
|
+{
|
|
|
+ return (vfnprintf(op, -1, fmt, ap));
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
#ifdef L_vsprintf
|
|
|
int vsprintf(char *sp, __const char *fmt, va_list ap)
|
|
|
{
|
|
@@ -334,7 +333,11 @@ int vfnprintf(FILE * op, size_t max_size, const char *fmt, va_list ap)
|
|
|
preci = -5;
|
|
|
radix = 10;
|
|
|
dpoint = 0;
|
|
|
- lval = (sizeof(int) == sizeof(long));
|
|
|
+#if INT_MAX != LONG_MAX
|
|
|
+ lval = 0;
|
|
|
+#else
|
|
|
+ lval = 1;
|
|
|
+#endif
|
|
|
|
|
|
tmp[1] = 0;
|
|
|
|
|
@@ -345,10 +348,12 @@ int vfnprintf(FILE * op, size_t max_size, const char *fmt, va_list ap)
|
|
|
flag[FLAG_0_PAD] = ' ';
|
|
|
|
|
|
|
|
|
- for (p = (char *)spec ; *p ; p++) {
|
|
|
+ for (p = (char *)spec ; *p ; ) {
|
|
|
if (*fmt == *p) {
|
|
|
flag[p-spec] = *fmt++;
|
|
|
p = (char *)spec;
|
|
|
+ } else {
|
|
|
+ p++;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -437,28 +442,35 @@ int vfnprintf(FILE * op, size_t max_size, const char *fmt, va_list ap)
|
|
|
#endif
|
|
|
} else {
|
|
|
#endif
|
|
|
+#if UINT_MAX != ULONG_MAX
|
|
|
+
|
|
|
p = __ultostr(tmp + sizeof(tmp) - 1, (unsigned long)
|
|
|
((lval)
|
|
|
? va_arg(ap, unsigned long)
|
|
|
: va_arg(ap, unsigned int)),
|
|
|
radix, upcase);
|
|
|
+#else
|
|
|
+
|
|
|
+ p = __ultostr(tmp + sizeof(tmp) - 1, (unsigned long)
|
|
|
+ va_arg(ap, unsigned long),
|
|
|
+ radix, upcase);
|
|
|
+#endif
|
|
|
#if WANT_LONG_LONG || WANT_LONG_LONG_ERROR
|
|
|
}
|
|
|
#endif
|
|
|
flag[FLAG_PLUS] = '\0';
|
|
|
- if (flag[FLAG_HASH]) {
|
|
|
- switch (radix) {
|
|
|
- case 16:
|
|
|
- flag[FLAG_PLUS] = '0';
|
|
|
- *--p = 'x';
|
|
|
+ if (flag[FLAG_HASH] && (*p != '0')) {
|
|
|
+ if (radix == 8) {
|
|
|
+ *--p = '0';
|
|
|
+ } else {
|
|
|
+ flag[FLAG_PLUS] = '0';
|
|
|
+ *--p = 'b';
|
|
|
+ if (radix == 16) {
|
|
|
+ *p = 'x';
|
|
|
if (*fmt == 'X') {
|
|
|
*p = 'X';
|
|
|
}
|
|
|
- break;
|
|
|
- case 8:
|
|
|
- if (*p != '0') {
|
|
|
- *--p = '0';
|
|
|
- }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
} else if (p-u_spec < 10) {
|
|
@@ -473,10 +485,17 @@ int vfnprintf(FILE * op, size_t max_size, const char *fmt, va_list ap)
|
|
|
#endif
|
|
|
} else {
|
|
|
#endif
|
|
|
+#if INT_MAX != LONG_MAX
|
|
|
+
|
|
|
p = __ltostr(tmp + sizeof(tmp) - 1, (long)
|
|
|
((lval)
|
|
|
? va_arg(ap, long)
|
|
|
: va_arg(ap, int)), 10, 0);
|
|
|
+#else
|
|
|
+
|
|
|
+ p = __ltostr(tmp + sizeof(tmp) - 1, (long)
|
|
|
+ va_arg(ap, long), 10, 0);
|
|
|
+#endif
|
|
|
#if WANT_LONG_LONG || WANT_LONG_LONG_ERROR
|
|
|
}
|
|
|
#endif
|
|
@@ -547,8 +566,8 @@ int vfnprintf(FILE * op, size_t max_size, const char *fmt, va_list ap)
|
|
|
|
|
|
if (preci < 0) {
|
|
|
preci = 0;
|
|
|
- if (flag[FLAG_PLUS]
|
|
|
- && !flag[FLAG_MINUS_LJUSTIFY]
|
|
|
+ if (!flag[FLAG_MINUS_LJUSTIFY]
|
|
|
+
|
|
|
&& (flag[FLAG_0_PAD] == '0')) {
|
|
|
preci = width;
|
|
|
width = 0;
|
|
@@ -560,7 +579,7 @@ int vfnprintf(FILE * op, size_t max_size, const char *fmt, va_list ap)
|
|
|
|
|
|
if ((!len && !preci)
|
|
|
|| (width && !flag[FLAG_MINUS_LJUSTIFY])) {
|
|
|
- ch = flag[FLAG_0_PAD];
|
|
|
+ ch = ' ';
|
|
|
--width;
|
|
|
} else if (flag[FLAG_PLUS]) {
|
|
|
ch = flag[FLAG_PLUS];
|
|
@@ -570,15 +589,12 @@ int vfnprintf(FILE * op, size_t max_size, const char *fmt, va_list ap)
|
|
|
flag[FLAG_PLUS] = '\0';
|
|
|
}
|
|
|
--len;
|
|
|
+ } else if (preci) {
|
|
|
+ ch = '0';
|
|
|
+ --preci;
|
|
|
} else {
|
|
|
- flag[FLAG_0_PAD]=' ';
|
|
|
- if (preci) {
|
|
|
- ch = '0';
|
|
|
- --preci;
|
|
|
- } else {
|
|
|
- ch = *p++;
|
|
|
- --len;
|
|
|
- }
|
|
|
+ ch = *p++;
|
|
|
+ --len;
|
|
|
}
|
|
|
|
|
|
if (++cnt < max_size) {
|
|
@@ -623,11 +639,3 @@ int vfnprintf(FILE * op, size_t max_size, const char *fmt, va_list ap)
|
|
|
|
|
|
#endif
|
|
|
|
|
|
-#ifdef L_vfprintf
|
|
|
-
|
|
|
-int vfprintf(FILE * op, register __const char *fmt, register va_list ap)
|
|
|
-{
|
|
|
- return (vfnprintf(op, -1, fmt, ap));
|
|
|
-}
|
|
|
-
|
|
|
-#endif
|