Another _doprnt fix for %L handling
authorAlan Modra <amodra@gmail.com>
Fri, 7 Jul 2017 00:49:08 +0000 (10:19 +0930)
committerAlan Modra <amodra@gmail.com>
Fri, 7 Jul 2017 01:05:31 +0000 (10:35 +0930)
* bfd.c (_doprnt): Replace "L" with "ll" when printing bfd_vma
as long long.  Move code replacing "ll" with "I64", and simplify.

bfd/ChangeLog
bfd/bfd.c

index eda1e3edea51d2f3d897c07421f26ec5bfc8ed2f..4a3a3acb1b205cf93f644eecb5d3c3ee64e55964 100644 (file)
@@ -1,3 +1,8 @@
+2017-07-07  Alan Modra  <amodra@gmail.com>
+
+       * bfd.c (_doprnt): Replace "L" with "ll" when printing bfd_vma
+       as long long.  Move code replacing "ll" with "I64", and simplify.
+
 2017-07-06  H.J. Lu  <hongjiu.lu@intel.com>
 
        * bfd.c (_doprnt): Convert 'L' to 'l' when setting wide_width
index a119ac4f54e67e98a6de958c263e1531d24b0284..665f182559b37b4b9f61fdac19eb117badb9d0d8 100644 (file)
--- a/bfd/bfd.c
+++ b/bfd/bfd.c
@@ -725,11 +725,17 @@ _doprnt (FILE *stream, const char *format, va_list ap)
                  {
                    /* L modifier for bfd_vma or bfd_size_type may be
                       either long long or long.  */
-                   if ((BFD_ARCH_SIZE < 64 || BFD_HOST_64BIT_LONG)
-                       && sptr[-2] == 'L')
+                   if (sptr[-2] == 'L')
                      {
-                       wide_width = 1;
                        sptr[-2] = 'l';
+                       if (BFD_ARCH_SIZE < 64 || BFD_HOST_64BIT_LONG)
+                         wide_width = 1;
+                       else
+                         {
+                           sptr[-1] = 'l';
+                           *sptr++ = ptr[-1];
+                           *sptr = '\0';
+                         }
                      }
 
                    switch (wide_width)
@@ -742,17 +748,14 @@ _doprnt (FILE *stream, const char *format, va_list ap)
                        break;
                      case 2:
                      default:
-#if defined (__GNUC__) || defined (HAVE_LONG_LONG)
-# if defined (__MSVCRT__)
-                       sptr--;
-                       while (sptr[-1] == 'L' || sptr[-1] == 'l')
-                         sptr--;
-                       *sptr++ = 'I';
-                       *sptr++ = '6';
-                       *sptr++ = '4';
+#if defined (__MSVCRT__)
+                       sptr[-3] = 'I';
+                       sptr[-2] = '6';
+                       sptr[-1] = '4';
                        *sptr++ = ptr[-1];
                        *sptr = '\0';
-# endif
+#endif
+#if defined (__GNUC__) || defined (HAVE_LONG_LONG)
                        PRINT_TYPE (long long);
 #else
                        /* Fake it and hope for the best.  */