]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib/printf: add %Ld/%Lu for int64_t/uint64_t
authorDavid Lamparter <equinox@diac24.net>
Sun, 12 May 2019 19:11:19 +0000 (21:11 +0200)
committerDavid Lamparter <equinox@diac24.net>
Mon, 3 Jun 2019 14:44:24 +0000 (16:44 +0200)
[u]int64_t is the only type in the intX_t family that needs
special-casing for printf since the calling convention may differ
between 32-bit and 64-bit systems.

Adding the L specifier allows us to eschew the gnarly-looking PRIu64.

Signed-off-by: David Lamparter <equinox@diac24.net>
lib/printf/printf-pos.c
lib/printf/vfprintf.c

index f4104c52bf6158d576bff899ad23ed617e831abd..7f83dea1aa3d2247ffc66bec1a35e1a10e441b24 100644 (file)
@@ -65,8 +65,8 @@ enum typeid {
        T_UNUSED, TP_SHORT, T_INT, T_U_INT, TP_INT,
        T_LONG, T_U_LONG, TP_LONG, T_LLONG, T_U_LLONG, TP_LLONG,
        T_PTRDIFFT, TP_PTRDIFFT, T_SSIZET, T_SIZET, TP_SSIZET,
-       T_INTMAXT, T_UINTMAXT, TP_INTMAXT, TP_VOID, TP_CHAR, TP_SCHAR,
-       T_DOUBLE, T_LONG_DOUBLE, T_WINT, TP_WCHAR
+       T_INT64T, T_UINT64T, T_INTMAXT, T_UINTMAXT, TP_INTMAXT, TP_VOID,
+       TP_CHAR, TP_SCHAR, T_DOUBLE, T_LONG_DOUBLE, T_WINT, TP_WCHAR
 };
 
 /* An expandable array of types. */
@@ -145,7 +145,9 @@ addsarg(struct typetable *types, int flags)
 
        if (_ensurespace(types))
                return (-1);
-       if (flags & INTMAXT)
+       if (flags & LONGDBL)
+               types->table[types->nextarg++] = T_INT64T;
+       else if (flags & INTMAXT)
                types->table[types->nextarg++] = T_INTMAXT;
        else if (flags & SIZET)
                types->table[types->nextarg++] = T_SSIZET;
@@ -166,7 +168,9 @@ adduarg(struct typetable *types, int flags)
 
        if (_ensurespace(types))
                return (-1);
-       if (flags & INTMAXT)
+       if (flags & LONGDBL)
+               types->table[types->nextarg++] = T_UINT64T;
+       else if (flags & INTMAXT)
                types->table[types->nextarg++] = T_UINTMAXT;
        else if (flags & SIZET)
                types->table[types->nextarg++] = T_SIZET;
@@ -311,11 +315,9 @@ reswitch:  switch (ch) {
                                goto rflag;
                        }
                        goto reswitch;
-#ifndef NO_FLOATING_POINT
                case 'L':
                        flags |= LONGDBL;
                        goto rflag;
-#endif
                case 'h':
                        if (flags & SHORTINT) {
                                flags &= ~SHORTINT;
@@ -504,11 +506,9 @@ reswitch:  switch (ch) {
                                goto rflag;
                        }
                        goto reswitch;
-#ifndef NO_FLOATING_POINT
                case 'L':
                        flags |= LONGDBL;
                        goto rflag;
-#endif
                case 'h':
                        if (flags & SHORTINT) {
                                flags &= ~SHORTINT;
@@ -743,6 +743,12 @@ build_arg_table(struct typetable *types, va_list ap, union arg **argtable)
                    case TP_INTMAXT:
                        (*argtable) [n].pintmaxarg = va_arg (ap, intmax_t *);
                        break;
+                   case T_INT64T:
+                       (*argtable) [n].intmaxarg = va_arg (ap, int64_t);
+                       break;
+                   case T_UINT64T:
+                       (*argtable) [n].uintmaxarg = va_arg (ap, uint64_t);
+                       break;
                    case T_DOUBLE:
 #ifndef NO_FLOATING_POINT
                        (*argtable) [n].doublearg = va_arg (ap, double);
index 58412a48ceb56fc6a42eb9f55cd06b02a57a995a..8c26c2f7c5c3185cdef34ea25116cf0c35b98d74 100644 (file)
@@ -224,14 +224,16 @@ __vfprintf(FILE *fp, const char *fmt0, va_list ap)
            flags&SHORTINT ? (u_long)(u_short)GETARG(int) : \
            flags&CHARINT ? (u_long)(u_char)GETARG(int) : \
            (u_long)GETARG(u_int))
-#define        INTMAX_SIZE     (INTMAXT|SIZET|PTRDIFFT|LLONGINT)
+#define        INTMAX_SIZE     (INTMAXT|SIZET|PTRDIFFT|LLONGINT|LONGDBL)
 #define SJARG() \
-       (flags&INTMAXT ? GETARG(intmax_t) : \
+       (flags&LONGDBL ? GETARG(int64_t) : \
+           flags&INTMAXT ? GETARG(intmax_t) : \
            flags&SIZET ? (intmax_t)GETARG(ssize_t) : \
            flags&PTRDIFFT ? (intmax_t)GETARG(ptrdiff_t) : \
            (intmax_t)GETARG(long long))
 #define        UJARG() \
-       (flags&INTMAXT ? GETARG(uintmax_t) : \
+       (flags&LONGDBL ? GETARG(uint64_t) : \
+           flags&INTMAXT ? GETARG(uintmax_t) : \
            flags&SIZET ? (uintmax_t)GETARG(size_t) : \
            flags&PTRDIFFT ? (uintmax_t)GETARG(ptrdiff_t) : \
            (uintmax_t)GETARG(unsigned long long))
@@ -377,11 +379,9 @@ reswitch:  switch (ch) {
                        }
                        width = n;
                        goto reswitch;
-#ifndef NO_FLOATING_POINT
                case 'L':
                        flags |= LONGDBL;
                        goto rflag;
-#endif
                case 'h':
                        if (flags & SHORTINT) {
                                flags &= ~SHORTINT;