Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: PATCH: Slightly improve printf %s
- X-seq: zsh-workers 21588
- From: "Thorsten Dahlheimer" <tdahlheim@xxxxxxx>
- To: "Wayne Davison" <wayned@xxxxxxxxxxxxxxxxxxxxx>
- Subject: Re: PATCH: Slightly improve printf %s
- Date: Tue, 9 Aug 2005 16:03:32 +0200
- Cc: <zsh-workers@xxxxxxxxxx>
- Mailing-list: contact zsh-workers-help@xxxxxxxxxx; run by ezmlm
- References: <024501c59c46$2ae19dc0$cc74fea9@pcdahl4201> <20050808230902.GC2986@xxxxxxxxx>
Wayne Davison wrote:
> On Mon, Aug 08, 2005 at 08:21:28PM +0200, Thorsten Dahlheimer wrote:
> > After I made this change, the test suite uncovered a bug (which I
> > introduced) in the handling of %b (and now %s) when no argument is
> > left, so the patch includes a fix for that, too.
>
> I didn't see that fix in the patch. I assume you're talking about
> this line (which is executed when the arg is missing):
>
> count += fprintf(fout, "%*c", width, ' ');
>
> ... since that would output a single space, even when "width" is 0. I
> changed the "else" that is in front of that line to "else if (width)",
> and it fixes the problem (I could have also changed the line to use
> fprintf(fout, "%*s", width, ""), but the former seems a litle more
> optimal).
Sorry, I attached the wrong diff (the one that I made before I discovered
that bug). Anyway, the fix I made is exactly the one you've described.
> As for the change to how %s is handled, can you show me an example where
> this is needed? In my simple tests, if a variable has a literal null in
> it, using either %b or %s to print it out with printf truncates the
> variable at the null (and, of course, a backslash-zero can be passed to
> %b to get a real null, but %s doesn't evaluate backslashes).
I don't know if it's really needed, but it would certainly be more
consistent. Currently you get:
% s=$'a\0b'
% print -n $s |od -tx1
0000000 61 00 62
0000003
% printf $s |od -tx1
0000000 61 00 62
0000003
% printf '%b' $s |od -tx1
0000000 61 00 62
0000003
% printf '%s' $s |od -tx1
0000000 61
0000001
(Note that the behaviour of %b in this case changed as a consequence
of zsh-workers/21552, item 4.) Given that the first three variants
treat the nul just like any other character, and the same is true
for the rest of zsh, I find the behaviour of %s a bit surprising.
I think it's conceivable that someone processes strings containing
nuls (say, captured output from 'find ... -print0' or the like) and
finally writes them out with print; this all works well with zsh.
Then they change the output command from 'print -nr -- "$s"' to
'printf "...%s..." ... "$s" ...' and get bitten.
Regards,
Thorsten Dahlheimer
Messages sorted by:
Reverse Date,
Date,
Thread,
Author