jds@cs.umd.edu (James da Silva) (04/01/91)
There are two problems with Estdio's handling of %[] "scanset" formats in scanf. 1. Estdio scanf stops the scan on whitespace. This is not consistent with the various Unix scanf() implementations I've seen. I'm not sure what ANSI says, but I *presume* it doesn't mandate Estdio's behavior; that would break a lot of code (including some I've just been foisted with :-). 2. The test for set membership is wrong. The bittest() macro returns the actual masked word if the bit is set, rather than just 0 or 1, so the bitwise xor with a boolean flag doesn't work. Simple rearrangement of the expression is all that is needed. Both problems are solved by changing one line: *** /tmp/RCSA000345 Mon Apr 1 01:36:56 1991 --- _vfscanf.c Mon Apr 1 01:33:19 1991 *************** *** 320,326 **** /* Scan input for satisfactory characters */ while (fieldwidth < 0 || fieldwidth--) { ! if (BLANK(ch) || ch <= 0 || ! (bittest(cset, ch) ^ invertedset)) break; if (! noassign) *p++ = ch; --- 320,326 ---- /* Scan input for satisfactory characters */ while (fieldwidth < 0 || fieldwidth--) { ! if (ch <= 0 || !bittest(cset, ch) ^ invertedset) break; if (! noassign) *p++ = ch; Jaime ........................................................................... : domain: jds@cs.umd.edu James da Silva : path: uunet!mimsy!jds Systems Design & Analysis Group