[erlang-patches] : fread failing to handle newlines gracefully

Raimo Niskanen raimo+erlang-patches@REDACTED
Tue Feb 10 11:47:56 CET 2009


On Thu, Feb 05, 2009 at 09:35:01AM +0100, Raimo Niskanen wrote:
> On Fri, Jan 30, 2009 at 11:12:23PM +1100, Matthew Palmer wrote:
> > Hi,
> > 
> > I recently fielded a question on Stack Overflow regarding some strange
> > behaviour of fread, with the ~d format spec
> > (http://stackoverflow.com/questions/473327/unexpected-behavior-of-iofread-in-erlang/490023#490023). 
> > Digging deep, it appears to be a bit of a bug in the way that newlines are
> > handled in the format parser, as demonstrated here:
> > 
> > 3> io_lib_fread:fread([], "10 11\n12 13 14\n", "~d").
> > {done,{ok,"\n"}," 1112 13 14\n"}
> > 
> > It's eaten the newline between "11" and "12", which means that on the next
> > pass through it'll read the next number as "1112" instead of "11", which
> > poses some obvious problems.
> > 
> > I've come up with the attached patch to fix the problem.  I'm not very
> > experienced with Erlang yet, so it might not be the cleanest way to do it,
> > but it does definitely fix the problem, and without (apparently) breaking
> > any other common use case.  Comments appreciated.  If there's a test suite I
> > should be adding to as well, I'm more than happy to do that, I just couldn't
> > find one in my source tarball.
> > 
> > - Matt
> 
> Thank you for your effort!
> 
> Your diagnosis and patch are basically right. I have now been digging
> into the matter and it took a while to ensure that. I will polish
> the patch a bit (the code needs some cleanup), and improve it
> for \r\n combinations.
> 
> Unfortunately there are no tests in the source tarball. We are striving
> towards their release but so far large parts of them are too much
> depending on our internal environment to be globally useful...
> 
> I will write tests too. When done I will release a new
> source code patch here.

OK. The patch is appended. I also found and corrected
a bug for e.g io_lib:fread("~s", "\rabc").

> 
> > --- ../erlang/erlang-12.b.3-dfsg/lib/stdlib/src/io_lib_fread.erl	2004-09-14 21:41:00.000000000 +1000
> > +++ ./io_lib_fread.erl	2009-01-30 15:44:57.000000000 +1100
> > @@ -35,9 +35,9 @@
> >      fread_collect(MoreChars, [], Rest, RestFormat, N, Inputs).
> >  
> >  fread_collect([$\r|More], Stack, Rest, RestFormat, N, Inputs) ->
> > -    fread(RestFormat, Rest ++ reverse(Stack), N, Inputs, More);
> > +    fread(RestFormat, Rest ++ reverse(Stack), N, Inputs, [$\r|More]);
> >  fread_collect([$\n|More], Stack, Rest, RestFormat, N, Inputs) ->
> > -    fread(RestFormat, Rest ++ reverse(Stack), N, Inputs, More);
> > +    fread(RestFormat, Rest ++ reverse(Stack), N, Inputs, [$\n|More]);
> >  fread_collect([C|More], Stack, Rest, RestFormat, N, Inputs) ->
> >      fread_collect(More, [C|Stack], Rest, RestFormat, N, Inputs);
> >  fread_collect([], Stack, Rest, RestFormat, N, Inputs) ->
> > @@ -55,8 +55,8 @@
> >  		eof ->
> >  		    fread(RestFormat,eof,N,Inputs,eof);
> >  		_ ->
> > -		    %% Don't forget to count the newline.
> > -		    {more,{More,RestFormat,N+1,Inputs}}
> > +		    %% Don't forget to strip and count the newline.
> > +		    {more,{tl(More),RestFormat,N+1,Inputs}}
> >  	    end;
> >  	Other ->				%An error has occurred
> >  	    {done,Other,More}
> 
> > _______________________________________________
> > erlang-patches mailing list
> > erlang-patches@REDACTED
> > http://www.erlang.org/mailman/listinfo/erlang-patches
> 
> -- 
> 
> / Raimo Niskanen, Erlang/OTP, Ericsson AB
> _______________________________________________
> erlang-patches mailing list
> erlang-patches@REDACTED
> http://www.erlang.org/mailman/listinfo/erlang-patches

-- 

/ Raimo Niskanen, Erlang/OTP, Ericsson AB
-------------- next part --------------
A non-text attachment was scrubbed...
Name: io_lib_fread.patch
Type: text/x-patch
Size: 4718 bytes
Desc: not available
URL: <http://erlang.org/pipermail/erlang-patches/attachments/20090210/d123e400/attachment.bin>


More information about the erlang-patches mailing list