From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-1.5 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 7452 invoked from network); 31 May 2023 14:05:23 -0000 Received: from second.openwall.net (193.110.157.125) by inbox.vuxu.org with ESMTPUTF8; 31 May 2023 14:05:23 -0000 Received: (qmail 14156 invoked by uid 550); 31 May 2023 14:05:10 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Reply-To: musl@lists.openwall.com Received: (qmail 14089 invoked from network); 31 May 2023 14:05:09 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=CPBRLRsC64vWoeSom+mCAhIhWnvcPPtQciGthEJTvQs=; b=HXfz2A6Ikarq1f1g9Ff7akykeKjOCuRhO967MIMBv1cHuVl8VTGEDN2U 1cN1DFjrl2OVsBzSb24nJKHPHJrF58FzEOm+L1tL4KoHtyOKSeCcGiJvh TaTM6y0A2v/cBGDvBRaJ87o6HnMXffVEixj2JmMk+zuJdBLWO7PcHa+a+ 4=; Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=Jens.Gustedt@inria.fr; dmarc=fail (p=none dis=none) d=inria.fr X-IronPort-AV: E=Sophos;i="6.00,207,1681164000"; d="scan'208";a="110511363" From: Jens Gustedt To: musl@lists.openwall.com Date: Wed, 31 May 2023 16:04:51 +0200 Message-Id: <17bf47a882d0b381f9bc633f11fb393911f0e4d2.1685535897.git.Jens.Gustedt@inria.fr> X-Mailer: git-send-email 2.34.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [musl] [C23 printf 1/3] C23: implement the b and B printf specifiers The b specifier is mandatory for C23. It has been reserved previously, so we may safely add it, even for older compilation modes. The B specifier is optional, but recommended for those implementations that didn't have it reserved previously for other purposes. The PRIbXXX and PRIBXXX macros are mandatory if the specifiers are supported and may serve as feature test macros for users. --- include/inttypes.h | 34 ++++++++++++++++++++++++++++++++++ src/stdio/vfprintf.c | 19 ++++++++++++++++++- src/stdio/vfwprintf.c | 11 +++++++++-- 3 files changed, 61 insertions(+), 3 deletions(-) diff --git a/include/inttypes.h b/include/inttypes.h index 61dcb727..73a42e32 100644 --- a/include/inttypes.h +++ b/include/inttypes.h @@ -120,12 +120,44 @@ uintmax_t wcstoumax(const wchar_t *__restrict, wchar_t **__restrict, int); #define PRIXFAST32 "X" #define PRIXFAST64 __PRI64 "X" +#define PRIb8 "b" +#define PRIb16 "b" +#define PRIb32 "b" +#define PRIb64 __PRI64 "b" + +#define PRIbLEAST8 "b" +#define PRIbLEAST16 "b" +#define PRIbLEAST32 "b" +#define PRIbLEAST64 __PRI64 "b" + +#define PRIbFAST8 "b" +#define PRIbFAST16 "b" +#define PRIbFAST32 "b" +#define PRIbFAST64 __PRI64 "b" + +#define PRIB8 "B" +#define PRIB16 "B" +#define PRIB32 "B" +#define PRIB64 __PRI64 "B" + +#define PRIBLEAST8 "B" +#define PRIBLEAST16 "B" +#define PRIBLEAST32 "B" +#define PRIBLEAST64 __PRI64 "B" + +#define PRIBFAST8 "B" +#define PRIBFAST16 "B" +#define PRIBFAST32 "B" +#define PRIBFAST64 __PRI64 "B" + #define PRIdMAX __PRI64 "d" #define PRIiMAX __PRI64 "i" #define PRIoMAX __PRI64 "o" #define PRIuMAX __PRI64 "u" #define PRIxMAX __PRI64 "x" #define PRIXMAX __PRI64 "X" +#define PRIbMAX __PRI64 "b" +#define PRIBMAX __PRI64 "B" #define PRIdPTR __PRIPTR "d" #define PRIiPTR __PRIPTR "i" @@ -133,6 +165,8 @@ uintmax_t wcstoumax(const wchar_t *__restrict, wchar_t **__restrict, int); #define PRIuPTR __PRIPTR "u" #define PRIxPTR __PRIPTR "x" #define PRIXPTR __PRIPTR "X" +#define PRIbPTR __PRIPTR "b" +#define PRIBPTR __PRIPTR "B" #define SCNd8 "hhd" #define SCNd16 "hd" diff --git a/src/stdio/vfprintf.c b/src/stdio/vfprintf.c index a712d80f..cbc79783 100644 --- a/src/stdio/vfprintf.c +++ b/src/stdio/vfprintf.c @@ -48,6 +48,7 @@ enum { static const unsigned char states[]['z'-'A'+1] = { { /* 0: bare types */ + S('b') = UINT, S('B') = UINT, S('d') = INT, S('i') = INT, S('o') = UINT, S('u') = UINT, S('x') = UINT, S('X') = UINT, S('e') = DBL, S('f') = DBL, S('g') = DBL, S('a') = DBL, @@ -58,6 +59,7 @@ static const unsigned char states[]['z'-'A'+1] = { S('l') = LPRE, S('h') = HPRE, S('L') = BIGLPRE, S('z') = ZTPRE, S('j') = JPRE, S('t') = ZTPRE, }, { /* 1: l-prefixed */ + S('b') = ULONG, S('B') = ULONG, S('d') = LONG, S('i') = LONG, S('o') = ULONG, S('u') = ULONG, S('x') = ULONG, S('X') = ULONG, S('e') = DBL, S('f') = DBL, S('g') = DBL, S('a') = DBL, @@ -65,17 +67,20 @@ static const unsigned char states[]['z'-'A'+1] = { S('c') = INT, S('s') = PTR, S('n') = PTR, S('l') = LLPRE, }, { /* 2: ll-prefixed */ + S('b') = ULLONG, S('B') = ULLONG, S('d') = LLONG, S('i') = LLONG, S('o') = ULLONG, S('u') = ULLONG, S('x') = ULLONG, S('X') = ULLONG, S('n') = PTR, }, { /* 3: h-prefixed */ + S('b') = USHORT, S('B') = USHORT, S('d') = SHORT, S('i') = SHORT, S('o') = USHORT, S('u') = USHORT, S('x') = USHORT, S('X') = USHORT, S('n') = PTR, S('h') = HHPRE, }, { /* 4: hh-prefixed */ + S('b') = UCHAR, S('B') = UCHAR, S('d') = CHAR, S('i') = CHAR, S('o') = UCHAR, S('u') = UCHAR, S('x') = UCHAR, S('X') = UCHAR, @@ -85,11 +90,13 @@ static const unsigned char states[]['z'-'A'+1] = { S('E') = LDBL, S('F') = LDBL, S('G') = LDBL, S('A') = LDBL, S('n') = PTR, }, { /* 6: z- or t-prefixed (assumed to be same size) */ + S('b') = SIZET, S('B') = SIZET, S('d') = PDIFF, S('i') = PDIFF, S('o') = SIZET, S('u') = SIZET, S('x') = SIZET, S('X') = SIZET, S('n') = PTR, }, { /* 7: j-prefixed */ + S('b') = UMAX, S('B') = UMAX, S('d') = IMAX, S('i') = IMAX, S('o') = UMAX, S('u') = UMAX, S('x') = UMAX, S('X') = UMAX, @@ -156,6 +163,12 @@ static char *fmt_x(uintmax_t x, char *s, int lower) return s; } +static char *fmt_b(uintmax_t x, char *s) +{ + for (; x; x>>=1) *--s = '0' + (x&1); + return s; +} + static char *fmt_o(uintmax_t x, char *s) { for (; x; x>>=3) *--s = '0' + (x&7); @@ -437,7 +450,7 @@ static int printf_core(FILE *f, const char *fmt, va_list *ap, union arg *nl_arg, unsigned st, ps; int cnt=0, l=0; size_t i; - char buf[sizeof(uintmax_t)*3+3+LDBL_MANT_DIG/4]; + char buf[sizeof(uintmax_t)*CHAR_BIT+3+LDBL_MANT_DIG/4]; const char *prefix; int t, pl; wchar_t wc[2], *ws; @@ -564,6 +577,10 @@ static int printf_core(FILE *f, const char *fmt, va_list *ap, union arg *nl_arg, a = fmt_x(arg.i, z, t&32); if (arg.i && (fl & ALT_FORM)) prefix+=(t>>4), pl=2; if (0) { + case 'b': case 'B': + a = fmt_b(arg.i, z); + if (arg.i && (fl & ALT_FORM)) prefix = (t == 'b' ? "0b" : "0B"), pl=2; + } if (0) { case 'o': a = fmt_o(arg.i, z); if ((fl&ALT_FORM) && p