From e5232a0f3b116314ce0694d4e6d360ddd96179db Mon Sep 17 00:00:00 2001 From: Jakob Kaivo Date: Fri, 15 Mar 2019 16:10:24 -0400 Subject: make escape output thru a pointer, on the way to proper width/precision support for %b --- printf.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/printf.c b/printf.c index 62a826f..757843f 100644 --- a/printf.c +++ b/printf.c @@ -25,7 +25,7 @@ static void diagnose(const char *fmt, ...) errors = 1; } -static const char *escape(const char *esc) +static const char *escape(const char *esc, char *out) { if (isdigit(*esc)) { char oct[4] = {0}; @@ -37,41 +37,41 @@ static const char *escape(const char *esc) oct[2] = *esc++; } - putchar(strtol(oct, NULL, 8)); + *out = (char)strtol(oct, NULL, 8); return esc; } switch (*esc) { case '\\': - putchar('\\'); + *out = '\\'; break; case 'a': - putchar('\a'); + *out = '\a'; break; case 'b': - putchar('\b'); + *out = '\b'; break; case 'f': - putchar('\f'); + *out = '\f'; break; case 'n': - putchar('\n'); + *out = '\n'; break; case 'r': - putchar('\r'); + *out = '\r'; break; case 't': - putchar('\t'); + *out = '\t'; break; case 'v': - putchar('\v'); + *out = '\v'; break; default: @@ -95,7 +95,9 @@ static const char *echo(const char *s) } if (*s == '0' || !isdigit(*s)) { - s = escape(s + 1); + char c = '\0'; + s = escape(s + 1, &c); + putchar(c); } else { diagnose("unknown escape \"\\%c\"", *s); s++; @@ -267,7 +269,9 @@ int printf_main(int argc, char *argv[]) } } } else if (*format == '\\') { - format = escape(format + 1); + char c = '\0'; + format = escape(format + 1, &c); + putchar(c); } else { putchar(*format); format++; -- cgit v1.2.1