More printf de-duplication.
Just trivial use of macros.
The %s/%ls case in __find_arguments was backwards in the wide copy of
the code, but not problematically so because all pointers are the same
size anyway.
Bug: http://b/67371539
Test: ran tests
Change-Id: I8d34915d75ae5425c56c59510a16c328fc481d20
diff --git a/libc/stdio/vfprintf.cpp b/libc/stdio/vfprintf.cpp
index 366b196..fe2e338 100644
--- a/libc/stdio/vfprintf.cpp
+++ b/libc/stdio/vfprintf.cpp
@@ -32,6 +32,7 @@
*/
#define CHAR_TYPE char
+#define FUNCTION_NAME __vfprintf
#include <sys/mman.h>
#include <sys/types.h>
@@ -108,8 +109,7 @@
* temporary buffer. We only work on write-only files; this avoids
* worries about ungetc buffers and so forth.
*/
-static int __sbprintf(FILE* fp, const char* fmt, va_list ap) {
- int ret;
+static int __sbprintf(FILE* fp, const CHAR_TYPE* fmt, va_list ap) {
FILE fake;
struct __sfileext fakeext;
unsigned char buf[BUFSIZ];
@@ -127,7 +127,7 @@
fake._lbfsize = 0; /* not actually used, but Just In Case */
/* do the work, then copy any error status */
- ret = __vfprintf(&fake, fmt, ap);
+ int ret = FUNCTION_NAME(&fake, fmt, ap);
if (ret >= 0 && __sflush(&fake)) ret = EOF;
if (fake._flags & __SERR) fp->_flags |= __SERR;
return (ret);
@@ -250,17 +250,16 @@
#define CHARINT 0x0800 /* 8 bit integer */
#define MAXINT 0x1000 /* largest integer size (intmax_t) */
-int __vfprintf(FILE* fp, const char* fmt0, __va_list ap) {
+int FUNCTION_NAME(FILE* fp, const CHAR_TYPE* fmt0, __va_list ap) {
int ch; /* character from fmt */
int n, n2; /* handy integers (short term usage) */
- char* cp; /* handy char pointer (short term usage) */
+ CHAR_TYPE* cp; /* handy char pointer (short term usage) */
struct __siov* iovp; /* for PRINT macro */
+ CHAR_TYPE sign; /* sign prefix (' ', '+', '-', or \0) */
int flags; /* flags as above */
int ret; /* return value accumulator */
int width; /* width from format (%8d), or 0 */
int prec; /* precision from format; <0 for N/A */
- char sign; /* sign prefix (' ', '+', '-', or \0) */
- mbstate_t ps;
/*
* We can decompose the printed representation of floating
* point numbers into several parts, some of which may be empty:
@@ -287,7 +286,7 @@
int expsize; /* character count for expstr */
int lead; /* sig figs before decimal or group sep */
int ndig; /* actual number of digits returned by dtoa */
- char expstr[MAXEXPDIG + 2]; /* buffer for exponent string: e+ZZZ */
+ CHAR_TYPE expstr[MAXEXPDIG + 2]; /* buffer for exponent string: e+ZZZ */
char* dtoaresult = NULL;
uintmax_t _umax; /* integer arguments %[diouxX] */
@@ -299,14 +298,14 @@
#define NIOV 8
struct __suio uio; /* output information: summary */
struct __siov iov[NIOV]; /* ... and individual io vectors */
- char buf[BUF]; /* buffer with space for digits of uintmax_t */
- char ox[2]; /* space for 0x; ox[1] is either x, X, or \0 */
+ CHAR_TYPE buf[BUF]; /* buffer with space for digits of uintmax_t */
+ CHAR_TYPE ox[2]; /* space for 0x; ox[1] is either x, X, or \0 */
union arg* argtable; /* args, built due to positional arg */
union arg statargtable[STATIC_ARG_TBL_SIZE];
size_t argtablesiz;
int nextarg; /* 1-based argument index */
va_list orgap; /* original argument pointer */
- char* convbuf; /* buffer for wide to multi-byte conversion */
+ CHAR_TYPE* convbuf; /* buffer for wide/multibyte conversion */
/*
* Choose PADSIZE to trade efficiency vs. size. If larger printf
@@ -466,7 +465,6 @@
ret = 0;
convbuf = NULL;
- memset(&ps, 0, sizeof(ps));
/*
* Scan the format for conversions (`%' character).
*/
@@ -1275,10 +1273,7 @@
flags |= LONGINT;
/*FALLTHROUGH*/
case 's':
- if (flags & LONGINT)
- ADDTYPE(TP_WCHAR);
- else
- ADDTYPE(TP_CHAR);
+ ADDTYPE((flags & LONGINT) ? TP_WCHAR : TP_CHAR);
break;
case 'U':
flags |= LONGINT;