From 9d65050e7beb201b6fbac0b666c39a979617412e Mon Sep 17 00:00:00 2001 From: David Schultz Date: Sat, 2 Aug 2008 06:02:02 +0000 Subject: [PATCH] POSIX says that octal escapes have the format \ddd in the format string, but \0ddd in a %b argument, with a length restriction of 3 octal digits in either case. This seems silly, but it needs to be right so it's possible to write an octal escape followed by an ordinary digit. Solaris printf(1) and GNU printf(1) also behave this way. Example: "printf '\0752'" now produces "=2" instead of garbage. --- usr.bin/printf/printf.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/usr.bin/printf/printf.c b/usr.bin/printf/printf.c index e86394dad52..5e7a9353aa3 100644 --- a/usr.bin/printf/printf.c +++ b/usr.bin/printf/printf.c @@ -408,7 +408,8 @@ escape(char *fmt, int percent, size_t *len) /* octal constant */ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': - for (c = *fmt == '0' ? 4 : 3, value = 0; + c = (!percent && *fmt == '0') ? 4 : 3; + for (value = 0; c-- && *fmt >= '0' && *fmt <= '7'; ++fmt) { value <<= 3; value += *fmt - '0';