[comp.os.minix] Bug in scanf

eesrajm@cc.brunel.ac.uk (Andrew J Michael) (08/29/90)

Duncan Grant, one of the customers of The MINIX Centre, has pointed out a
couple of bugs with scanf().  The %c and %[...] arguments skip whitespace
when they shouldn't, and the %h argument is not implemented.  He provided
a patch against 1.3, which I have modified for 1.5.10.  Note that patch will
tell you that the diff is offset by 11 lines - this is due to the presence
of RCS headers in my source.

Andy Michael

------- snip, snip ----------------------------

*** /tmp/,RCSt1000196	Mon Aug 27 10:30:54 1990
--- scanf.c	Mon Aug 27 10:29:25 1990
***************
*** 13,18 ****
--- 16,25 ----
  #include <stdarg.h>
  /* scanf - formatted input conversion	Author: Patrick van Kleef */
  
+ /* Modified by Duncan Grant 10 July '90 to remove whitespace skips
+    with %c and %[..]; and to recognise the 'h' size specifier.
+  */
+ 
  #include <stdio.h>
  #include <ctype.h>
  
***************
*** 46,51 ****
--- 53,59 ----
  
  union ptr_union {
    char *chr_p;
+   unsigned short *ushort_p;
    unsigned int *uint_p;
    unsigned long *ulong_p;
  };
***************
*** 113,118 ****
--- 121,127 ----
    unsigned width;		/* width of field */
    int widflag;			/* width was specified */
    int longflag;			/* true if long */
+   int shortflag;		/* true if short */
    int done_some;		/* true if we have seen some data */
    int reverse;			/* reverse the checking in [...] */
    char *endbracket;		/* position of the ] in format string */
***************
*** 154,160 ****
  		width = (unsigned) UINT_MAX;	/* very wide */
  	}
  	if (longflag = (tolower(*format) == 'l')) ++format;
! 	if (*format != 'c') while (isspace(ic))
  			rnc();
  	done_some = 0;		/* nothing yet */
  	switch (*format) {
--- 163,171 ----
  		width = (unsigned) UINT_MAX;	/* very wide */
  	}
  	if (longflag = (tolower(*format) == 'l')) ++format;
! 	if (shortflag = (tolower (*format) == 'h')) ++format;
! 	if ((*format != 'c') && (*format != '['))
! 		while (isspace(ic))
  			rnc();
  	done_some = 0;		/* nothing yet */
  	switch (*format) {
***************
*** 248,254 ****
  
  		*endbracket = '\0';	/* change format string */
  
! 		while (width-- && !isspace(ic) && ic > 0 &&
  		       (scnindex(ic, format) ^ reverse)) {
  			if (do_assign) *(argp)->chr_p++ = (char) ic;
  			rnc();
--- 259,265 ----
  
  		*endbracket = '\0';	/* change format string */
  
! 		while (width-- && ic > 0 &&
  		       (scnindex(ic, format) ^ reverse)) {
  			if (do_assign) *(argp)->chr_p++ = (char) ic;
  			rnc();



-- 
Andy Michael (eesrajm@cc.brunel.ac.uk)      " Software cannot be written to
85 Hawthorne Crescent                        be completely free of errors."
West Drayton
Middlesex                                    - Acorn Computers Ltd.
UB7 9PA