]> sourceware.org Git - glibc.git/commitdiff
Update.
authorUlrich Drepper <drepper@redhat.com>
Fri, 18 Sep 1998 18:51:34 +0000 (18:51 +0000)
committerUlrich Drepper <drepper@redhat.com>
Fri, 18 Sep 1998 18:51:34 +0000 (18:51 +0000)
* stdio-common/vfscanf.c: Fix reading (nil) for %p.

ChangeLog
stdio-common/vfscanf.c

index 7299d958f18528c429fdf49023c7830f5ff939a3..10b7215b99a8cb5c23a9641031daf0be49ccbf9d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -25,6 +25,8 @@
 
        * time/strftime.c [_LIBC] (ampm): Use tp->tm_hour not hour12.
 
+       * stdio-common/vfscanf.c: Fix reading (nil) for %p.
+
 1998-09-18  Mark Kettenis  <kettenis@phys.uva.nl>
 
        * login/programs/pt_chown.c (more_help): Correct message that
index f9bbb6929e12fa3f5222e097407066d03c4dfb3f..ec4a264d6591288b6ea43c0cb210ca132b4d6f37 100644 (file)
@@ -216,6 +216,8 @@ __vfscanf (FILE *s, const char *format, va_list argptr)
      possibly be matched even if in the input stream no character is
      available anymore.  */
   int skip_space = 0;
+  /* Nonzero if we are reading a pointer.  */
+  int read_pointer;
   /* Workspace.  */
   char *tw;                    /* Temporary pointer.  */
   char *wp = NULL;             /* Workspace.  */
@@ -354,6 +356,9 @@ __vfscanf (FILE *s, const char *format, va_list argptr)
       /* This is the start of the conversion string. */
       flags = 0;
 
+      /* Not yet decided whether we read a pointer or not.  */
+      read_pointer = 0;
+
       /* Initialize state of modifiers.  */
       argpos = 0;
 
@@ -871,13 +876,32 @@ __vfscanf (FILE *s, const char *format, va_list argptr)
              c = inchar ();
            }
 
-         /* The just read character is not part of the number anymore.  */
-         ungetc (c, s);
-
          if (wpsize == 0 ||
              (wpsize == 1 && (wp[0] == '+' || wp[0] == '-')))
-           /* There was no number.  */
-           conv_error ();
+           {
+             /* There was no number.  If we are supposed to read a pointer
+                we must recognize "(nil)" as well.  */
+             if (wpsize == 0 && read_pointer && (width < 0 || width >= 0)
+                 && c == '('
+                 && tolower (inchar ()) == 'n'
+                 && tolower (inchar ()) == 'i'
+                 && tolower (inchar ()) == 'l'
+                 && inchar () == ')')
+               /* We must produce the value of a NULL pointer.  A single
+                  '0' digit is enough.  */
+               ADDW ('0');
+             else
+               {
+                 /* The last read character is not part of the number
+                    anymore.  */
+                 ungetc (c, s);
+
+                 conv_error ();
+               }
+           }
+         else
+           /* The just read character is not part of the number anymore.  */
+           ungetc (c, s);
 
          /* Convert the number.  */
          ADDW ('\0');
@@ -1221,6 +1245,7 @@ __vfscanf (FILE *s, const char *format, va_list argptr)
          flags &= ~(SHORT|LONGDBL);
          flags |= LONG;
          number_signed = 0;
+         read_pointer = 1;
          goto number;
        }
     }
This page took 0.055322 seconds and 5 git commands to generate.