Thread View: comp.bugs.misc
4 messages
4 total messages
Started by tom
Tue, 07 Jul 1987 08:18
doscan.o bug in Ultrix 1.2 & 2.0
Author: tom
Date: Tue, 07 Jul 1987 08:18
Date: Tue, 07 Jul 1987 08:18
31 lines
1458 bytes
1458 bytes
Bug in doscan.o in /lib/libc.a on ULTRIX 1.2 and ULTRIX 2.0.
Try in you program.c the following line:
val = fscanf(file,"%*[ \t\n]%74[abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]", namebuf);
In case your input does not begin with space, tab or newline, scanf will
return 0 which is not right, since "*" should match "0 or more" .
The pascal compiler uses this type of scanf to read enumerated type data.
Try for example the following program:
( you can use any enumerated type instead of boolean).
program test(input,output);
var
a :boolean;
begin
readln(a);
writeln(a);
end.
Try as input the word "false" with and without leading blank.
You will get the following error : ( without leading blank)
Trace/BPT trap
Unknown name "" found on enumerated type read
I have inform DEC, but meanwhile i installed 4.3 doscan.o into
Ultrix libc.a.
Re: doscan.o bug in Ultrix 1.2 & 2.0
Author: guy
Date: Tue, 07 Jul 1987 18:25
Date: Tue, 07 Jul 1987 18:25
32 lines
1849 bytes
1849 bytes
> val = fscanf(file,"%*[ \t\n]%74[abcdefghijklmnopqrstuvwxyz
> ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]", namebuf);
>
> In case your input does not begin with space, tab or newline, scanf will
> return 0 which is not right, since "*" should match "0 or more" .
I presume the "0 or more" comes from the ULTRIX manual; I see nothing like
it in the 4.3BSD manual. The 4.3BSD manual does not indicate one way
or the other whether a zero-length match for a "%[]" item is
considered a successful or failed match. If it is a successful
match, then a zero-length match of the "%74[abc...]" item is also a
successful match.
It sounds like they may be using the S5 version of "doscan", either
for S5 compatibility or because it fixes a number of bugs in the 4.3
version. The SVID says for "%[]" conversions:
...At least one character must match for this conversion to
be considered successful.
and the October 1, 1986 ANSI C draft says:
...If the length of the input item is zero, the execution of
the directive fails: this condition is a matching failure,
unless an error prevented input from the stream, in which
case it is an input failure.
In other words, this behavior is most likely here to stay. The bug
is in the Pascal runtime, not in "scanf".
Guy Harris
{ihnp4, decvax, seismo, decwrl, ...}!sun!guy
guy@sun.com
Re: doscan.o bug in Ultrix 1.2 & 2.0
Author: Brandon Allbery
Date: Sat, 11 Jul 1987 03:53
Date: Sat, 11 Jul 1987 03:53
31 lines
2388 bytes
2388 bytes
As quoted from <309@nsta.UUCP> by tom@nsta.UUCP (Tom Gorodecki):
+---------------
| Bug in doscan.o in /lib/libc.a on ULTRIX 1.2 and ULTRIX 2.0.
| Try in you program.c the following line:
|
| val = fscanf(file,"%*[ \t\n]%74[abcdefghijklmnopqrstuvwxyz
| ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]", namebuf);
|
| In case your input does not begin with space, tab or newline, scanf will
| return 0 which is not right, since "*" should match "0 or more" .
+---------------
* means match but don't assign. As to whether %[ succeeds on match 0 instances,
this appears to be a matter of interpretation; there isn't an answer. (I
discovered this when UC 0.4.3 used %[ in userfile parsing; I recoded the
getuser() routine to avoid it for 0.4.4.)
In general, it's best not to use fscanf() unless you are absolutely certain
of the file's format. (News B2.11 is quite fragile in this regard.) I
would solve it (for anything but Pascal I/O )-: by fgets(), then skip over
leading whitespace and sscanf() the string. For Pascal, it gets harder;
the "best" way is skip whitespace, then read characters until you match the
longest value-string defined for the scalar type being input. (If the list
is organized in alphabetical order (or an array of pointers to them is so
organized), this can be done optimally.
--
[Copyright 1987 Brandon S. Allbery, all rights reserved] \ ncoast 216 781 6201
[Redistributable only if redistribution is subsequently permitted.] \ 2400 bd.
Brandon S. Allbery, moderator of comp.sources.misc and comp.binaries.ibm.pc
{{ames,harvard,mit-eddie}!necntc,{well,ihnp4}!hoptoad,cbosgd}!ncoast!allbery
<<The opinions herein are those of my cat, therefore they must be correct!>>
Re: doscan.o bug in Ultrix 1.2 & 2.0
Author: Spencer Garrett
Date: Mon, 13 Jul 1987 00:26
Date: Mon, 13 Jul 1987 00:26
20 lines
1461 bytes
1461 bytes
-> As quoted from <309@nsta.UUCP> by tom@nsta.UUCP (Tom Gorodecki): -> +--------------- -> | Bug in doscan.o in /lib/libc.a on ULTRIX 1.2 and ULTRIX 2.0. -> | Try in you program.c the following line: -> | -> | val = fscanf(file,"%*[ \t\n]%74[abcdefghijklmnopqrstuvwxyz -> | ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]", namebuf); -> | -> | In case your input does not begin with space, tab or newline, scanf will -> | return 0 which is not right, since "*" should match "0 or more" . -> +--------------- But the following code would work on any unix system I've ever encountered: val = fscanf(file, " %74[a-zA-Z0-9]", namebuf); Whitespace in the format string matches OPTIONAL whitespace in the input stream. The %[] format requires that SOMETHING match its scanstring. The * only means "0 or more" in regular expressions. In the example above it is being used to suppress storing the result of the match.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads