zsh-workers
 help / color / mirror / code / Atom feed
From: "Thorsten Dahlheimer" <tdahlheim@gmx.net>
To: "Wayne Davison" <wayned@users.sourceforge.net>
Cc: <zsh-workers@sunsite.dk>
Subject: Re: PATCH: Slightly improve printf %s
Date: Tue, 9 Aug 2005 16:03:32 +0200	[thread overview]
Message-ID: <007901c59ceb$2bbbc220$9aa4fea9@pcdahl4201> (raw)
In-Reply-To: <20050808230902.GC2986@blorf.net>

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


  reply	other threads:[~2005-08-09 13:54 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-08-08 18:21 Thorsten Dahlheimer
2005-08-08 23:09 ` Wayne Davison
2005-08-09 14:03   ` Thorsten Dahlheimer [this message]
2005-08-09 17:31     ` Wayne Davison

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='007901c59ceb$2bbbc220$9aa4fea9@pcdahl4201' \
    --to=tdahlheim@gmx.net \
    --cc=wayned@users.sourceforge.net \
    --cc=zsh-workers@sunsite.dk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).