Date: Fri, 14 Dec 2001 20:37:17 -0500 From: Mike Barcroft <mike@FreeBSD.org> To: Alexey Zelkin <phantom@FreeBSD.org> Cc: cvs-committers@FreeBSD.org, cvs-all@FreeBSD.org Subject: Re: cvs commit: src/lib/libc/stdio vfprintf.c Message-ID: <20011214203717.H68310@espresso.q9media.com> In-Reply-To: <200112131945.fBDJjfC52857@freefall.freebsd.org>; from phantom@FreeBSD.org on Thu, Dec 13, 2001 at 11:45:41AM -0800 References: <200112131945.fBDJjfC52857@freefall.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
Alexey Zelkin <phantom@FreeBSD.org> writes: > phantom 2001/12/13 11:45:41 PST > > Modified files: > lib/libc/stdio vfprintf.c > Log: > Respect locale while handling of \' flag. > > In original version grouping was hardcoded. It assumed that thousands > separator should be inserted to separate each 3 numbers. I.e. grouping > string "\003" was assumed for all cases. In correct case (per POSIX) > vfprintf should respect locale defined non-monetary (LC_NUMERIC > category) grouping sequence. > > Also simplify thousands_sep handling. > > Revision Changes Path > 1.34 +63 -22 src/lib/libc/stdio/vfprintf.c This commit has some style bugs: > Index: src/lib/libc/stdio/vfprintf.c > =================================================================== > RCS file: /home/ncvs/src/lib/libc/stdio/vfprintf.c,v > retrieving revision 1.33 > retrieving revision 1.34 > diff -u -r1.33 -r1.34 > --- src/lib/libc/stdio/vfprintf.c 2001/12/07 12:38:47 1.33 > +++ src/lib/libc/stdio/vfprintf.c 2001/12/13 19:45:41 1.34 [...] > @@ -114,8 +114,8 @@ > > static int __sprint __P((FILE *, struct __suio *)); > static int __sbprintf __P((FILE *, const char *, va_list)) __printflike(2, 0); > -static char * __ujtoa __P((uintmax_t, char *, int, int, char *, const char *)); > -static char * __ultoa __P((u_long, char *, int, int, char *, const char *)); > +static char * __ujtoa __P((uintmax_t, char *, int, int, char *, int, char, const char *)); > +static char * __ultoa __P((u_long, char *, int, int, char *, int, char, const char *)); Lines exceed 80 characters. > @@ -185,7 +185,7 @@ > */ > static char * > __ultoa(u_long val, char *endp, int base, int octzero, char *xdigs, > - const char *thousep) > + int needgrp, char thousep, const char *grp) > { > register char *cp = endp; > register long sval; > @@ -216,9 +216,20 @@ > sval = val; > do { > *--cp = to_char(sval % 10); > - if (++ndig == 3 && thousep && *thousep != '\0') { > - *--cp = *thousep; > + ndig++; > + /* > + * If (*grp == CHAR_MAX) then no more grouping > + * should be performed. > + */ > + if (needgrp && ndig == *grp && *grp != CHAR_MAX) { > + *--cp = thousep; > ndig = 0; > + /* > + * If (*(grp+1) == '\0') then we have to > + * use *grp character (last grouping rule) > + * for all next cases > + */ > + if (*(grp+1) != '\0') grp++; Missing new line after if condition. > @@ -275,10 +286,21 @@ > sval = val; > do { > *--cp = to_char(sval % 10); > - if (++ndig == 3 && thousep && *thousep != '\0') { > - *--cp = *thousep; > + ndig++; > + /* > + * If (*grp == CHAR_MAX) then no more grouping > + * should be performed. > + */ > + if (needgrp && *grp != CHAR_MAX && ndig == *grp) { > + *--cp = thousep; > ndig = 0; > - } > + /* > + * If (*(grp+1) == '\0') then we have to > + * use *grp character (last grouping rule) > + * for all next cases > + */ > + if (*(grp+1) != '\0') grp++; Missing new line after if condition. + } Spaces used instead of tabs to indent. > @@ -349,11 +371,12 @@ > #define SHORTINT 0x040 /* short integer */ > #define ZEROPAD 0x080 /* zero (as opposed to blank) pad */ > #define FPT 0x100 /* Floating point number */ This one isn't yours, but there's a space used here instead of a tab. > @@ -371,7 +394,8 @@ > int width; /* width from format (%8d), or 0 */ > int prec; /* precision from format (%.3d), or -1 */ > char sign; /* sign prefix (' ', '+', '-', or \0) */ > - const char *thousands_sep; /* locale specific thousands separator */ > + char thousands_sep; /* locale specific thousands separator */ > + const char *grouping; /* locale specific numeric grouping rules */ > #ifdef FLOATING_POINT > char *decimal_point; /* locale specific decimal point */ > char softsign; /* temporary negative sign for floats */ > @@ -500,9 +524,10 @@ > } else { \ > val = GETARG (int); \ > } > - > > - thousands_sep = NULL; > + > + thousands_sep = '\0'; Something funky happened here. I would recommend removing all the vertical space here to avoid future mishaps. > @@ -686,6 +713,14 @@ > #endif > case 'e': > case 'E': > + /* > + * Grouping apply to %i, %d, %u, %f, %F, %g, %G > + * conversion specifiers only. For other conversions > + * behavior is undefined. > + * -- POSIX > + */ These comments aren't KNF. The first line should be `/*-' to avoid reformatting the `-- POSIX' line when using indent(1). > @@ -851,6 +886,8 @@ > (flags & INTMAX_SIZE ? ujval != 0 : ulval != 0)) > flags |= HEXPREFIX; > > + flags &= ~GROUPING; > + Gratuitous vertical spacing. Best regards, Mike Barcroft To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe cvs-all" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20011214203717.H68310>