"C" character set (again)
Thomas Wolff
towo@towo.net
Fri Jan 8 15:53:00 GMT 2010
Eric Blake wrote:
> According to Thomas Wolff on 1/8/2010 7:40 AM:
>
>> While Andy had a valid point in finding *format* to be described as a
>> "character string" and relating that to a generic POSIX definition of
>> character,
>> this certainly does not justify the current behaviour of slient dropping
>> and reporting partial success because that is not one of the options in
>> the "RETURN VALUE" section;
>> also I don't see what Andy's claim "Including invalid bytes in the
>> format string is undefined behaviour." is based on.
>>
Part of my point was to work this out more precisely, so please let me
stir around once more:
> Per POSIX, printf is only defined if you pass a valid character string as the format.
Based on what? The manpage lists a number of cases of "results are
undefined" explicitly (e.g. insufficient arguments) but the case of an
invalid character in the format string is *not* among them, unless you
would account the EILSEQ clause to that aim, which I wouldn't because
the format string is not a wide character string.
So for this reasoning, you could only base on deduction of general
descriptions (using the word "character") in relation to generic
definitions (somewhere else in POSIX).
This is a weaker point, however, and not in line with the general
tendency of POSIX to describe the API clearly.
And it has to be viewed in contrast with sections "RETURN VALUE" and
"ERRORS" which *are* described clearly.
So *if* one could arguably sustain the view that invalid multi-byte
characters in the format wouldn't need to be handled transparently,
it would be mandatory for printf to return -1 in that case and set
errno=EILSEQ.
> If you pass an 8-bit value but it is not a character, then
> you did not pass a valid format string.
That may be the case (I'm almost convinced meanwhile by Andy and you)
but yet... see above, it doesn't mean "completely undefined".
> That's why your behavior was undefined, and so ANYTHING can happen
No, not quite anything, APIs are not pure maths, Return Value conditions
still have to be met.
> ...
>
> My opinion is that it would still be nice to keep "C" in the UTF-8 charset
> (to encourage people to fix their programs that do not comply with POSIX
> rules about the C locale), but to fix 8-bit transparency issues in as many
> APIs as possible (such as printf) so that invalid characters are at least
> still handled as transparently-clean 8-bit bytes.
Yes, please.
> In the long run,
> sticking with the UTF-8 charset will only be doing users a favor, even if
> we end up having to point people to the FAQ about locale implications.
>
With this, I fully agree.
------
Thomas
More information about the Cygwin-developers
mailing list