Handle ' and I format flags
authorAlan Modra <amodra@gmail.com>
Wed, 15 Nov 2017 11:46:08 +0000 (22:16 +1030)
committerAlan Modra <amodra@gmail.com>
Wed, 15 Nov 2017 12:00:27 +0000 (22:30 +1030)
Also a little tidying and error checking.

* bfd.c (union _bfd_doprnt_args): Add "Bad".
(_bfd_doprnt): Handle more flags.
(_bfd_doprnt_scan): Likewise.  Tidy setting of args array.
(error_handler_internal): Init args type to Bad.

bfd/ChangeLog
bfd/bfd.c

index ea8efcf16a781b8b74b9b46b6204b25cf9a9e62a..648006e64f0015a93aeda2fd5f5b34db1ba11851 100644 (file)
@@ -1,3 +1,10 @@
+2017-11-15  Alan Modra  <amodra@gmail.com>
+
+       * bfd.c (union _bfd_doprnt_args): Add "Bad".
+       (_bfd_doprnt): Handle more flags.
+       (_bfd_doprnt_scan): Likewise.  Tidy setting of args array.
+       (error_handler_internal): Init args type to Bad.
+
 2017-11-14  Alan Modra  <amodra@gmail.com>
 
        PR 22431
index 35f748c3f9c69d2443af695d7bff4aea9d702d51..40a195b5b00727ce555578e10f45e00d042a280a 100644 (file)
--- a/bfd/bfd.c
+++ b/bfd/bfd.c
@@ -638,6 +638,7 @@ union _bfd_doprnt_args
   void *p;
   enum
   {
+    Bad,
     Int,
     Long,
     LongLong,
@@ -707,7 +708,7 @@ _bfd_doprnt (FILE *stream, const char *format, union _bfd_doprnt_args *args)
            }
 
          /* Move past flags.  */
-         while (strchr ("-+ #0", *ptr))
+         while (strchr ("-+ #0'I", *ptr))
            *sptr++ = *ptr++;
 
          if (*ptr == '*')
@@ -948,6 +949,7 @@ _bfd_doprnt_scan (const char *format, union _bfd_doprnt_args *args)
        {
          int wide_width = 0, short_width = 0;
          unsigned int arg_no;
+         int arg_type;
 
          ptr++;
 
@@ -960,7 +962,7 @@ _bfd_doprnt_scan (const char *format, union _bfd_doprnt_args *args)
            }
 
          /* Move past flags.  */
-         while (strchr ("-+ #0", *ptr))
+         while (strchr ("-+ #0'I", *ptr))
            ptr++;
 
          if (*ptr == '*')
@@ -1032,8 +1034,7 @@ _bfd_doprnt_scan (const char *format, union _bfd_doprnt_args *args)
          if ((int) arg_no < 0)
            arg_no = arg_count;
 
-         if (arg_no >= 9)
-           abort ();
+         arg_type = Bad;
          switch (ptr[-1])
            {
            case 'd':
@@ -1045,7 +1046,7 @@ _bfd_doprnt_scan (const char *format, union _bfd_doprnt_args *args)
            case 'c':
              {
                if (short_width)
-                 args[arg_no].type = Int;
+                 arg_type = Int;
                else
                  {
                    if (ptr[-2] == 'L')
@@ -1057,17 +1058,17 @@ _bfd_doprnt_scan (const char *format, union _bfd_doprnt_args *args)
                    switch (wide_width)
                      {
                      case 0:
-                       args[arg_no].type = Int;
+                       arg_type = Int;
                        break;
                      case 1:
-                       args[arg_no].type = Long;
+                       arg_type = Long;
                        break;
                      case 2:
                      default:
 #if defined (__GNUC__) || defined (HAVE_LONG_LONG)
-                       args[arg_no].type = LongLong;
+                       arg_type = LongLong;
 #else
-                       args[arg_no].type = Long;
+                       arg_type = Long;
 #endif
                        break;
                      }
@@ -1081,13 +1082,13 @@ _bfd_doprnt_scan (const char *format, union _bfd_doprnt_args *args)
            case 'G':
              {
                if (wide_width == 0)
-                 args[arg_no].type = Double;
+                 arg_type = Double;
                else
                  {
 #if defined (__GNUC__) || defined (HAVE_LONG_DOUBLE)
-                   args[arg_no].type = LongDouble;
+                   arg_type = LongDouble;
 #else
-                   args[arg_no].type = Double;
+                   arg_type = Double;
 #endif
                  }
              }
@@ -1096,11 +1097,15 @@ _bfd_doprnt_scan (const char *format, union _bfd_doprnt_args *args)
            case 'p':
            case 'A':
            case 'B':
-             args[arg_no].type = Ptr;
+             arg_type = Ptr;
              break;
            default:
              abort();
            }
+
+         if (arg_no >= 9)
+           abort ();
+         args[arg_no].type = arg_type;
          arg_count++;
        }
     }
@@ -1119,9 +1124,12 @@ _bfd_doprnt_scan (const char *format, union _bfd_doprnt_args *args)
 static void
 error_handler_internal (const char *fmt, va_list ap)
 {
-  int i, arg_count;
+  unsigned int i, arg_count;
   union _bfd_doprnt_args args[9];
 
+  for (i = 0; i < sizeof (args) / sizeof (args[0]); i++)
+    args[i].type = Bad;
+
   arg_count = _bfd_doprnt_scan (fmt, args);
   for (i = 0; i < arg_count; i++)
     {