Subject: Re: new stdlib?
To: Michael Richardson <mcr@sandelman.ottawa.on.ca>
From: Richard Pennington <rich@introl.com>
List: netbsd-help
Date: 02/09/2000 20:41:50
In our compilers, varargs functions use "normal" promotion and
non-varargs functions use "best fit". Of course, leaving out a prototype
is bad.
-Rich
On Wed, 09 Feb 2000, Michael Richardson wrote:
>>>>>> "Paul" == Paul Sander <paul@wakawaka.com> writes:
> Paul> The %m$nd format has to do with the XPG4 standard, as defined by The Open
> Paul> Group (formerly X/Open and OSF, I believe). It allows the rearrangement of
> Paul> the arguments with regard to localization.
>
> My understanding is that this only works if you can guarantee that all
>arguments are of the same size, which is not the case in ANSI C anymore since
>you don't have to do default promotion rules.
> I wonder how they get it to work?
>
>
> Paul> An example of this usage would be localizing the display of a date. To
> Paul> show a date in American format, you could use something like this:
>
> Paul> sprintf( c_datestring, "%2$02d/%1$02d/%3$04d",
> Paul> (int)tmdate.tm_mday, (int)tmdate.tm_mon+1,
> Paul> (int)tmdate.tm_year+1900 );
>
> Paul> But the European format reverses the month and day, like this:
>
> Paul> sprintf( c_datestring, "%1$02d/%2$02d/%3$04d",
> Paul> (int)tmdate.tm_mday, (int)tmdate.tm_mon+1,
> Paul> (int)tmdate.tm_year+1900 );
>
> Paul> The value of this becomes apparent when the format string itself is
> Paul> read from a message catalog.
>
> Paul> You can find details on www.opengroup.org and searching for sprintf in
> Paul> "The Single Unix Specification" (which you must hunt for, and register
> Paul> to read for free).
>
> Paul> --- Forwarded mail from wulf@ping.net.au
>
> Paul> does anyone know the following construct? It was found in anteater
> Paul> which segfaults at that point.
>
> Paul> [...]
> Paul> sprintf( c_datestring, "year %1$02d, day %2$02d, month %3$04d",
> Paul> (int)tmdate.tm_mday, (int)tmdate.tm_mon+1,
> Paul> (int)tmdate.tm_year+1900 );
> Paul> string newdate = c_datestring;
> Paul> return newdate;
>
> Paul> I've expanded the format string which is constructed earlier
> Paul> in the code. I've never seen the use of a "%1$02d" format string nor have I
> Paul> found any references in books and manuals. When changed to
> Paul> "%02d" the program runs fine and displays the correct date format.
>
> Paul> Is there a new stdlib with extentions of the current format string? I am
> Paul> using egcs-1.1.1 and standard libraries as shipped with NetBSD-1.4.1.
>
> Paul> --- End of forwarded message from wulf@ping.net.au
--
Richard Pennington Introl Corporation, Milwaukee, WI USA
Email: rich@introl.com Phone: +1 414-273-6100 Fax: +1 414-273-6106
US and Canada: 1 800-327-7171
Cross development tools for the 68HC05, 68HC08, 6809, 68HC11, 68HC12, 68HC16,
and 68XXX: http://www.introl.com ftp://ftp.introl.com