strfmon: style fixes

(cherry picked from commit 56a0d5444d6f39302f3476b61c1b81ed39abe589)
This commit is contained in:
Jose Luis Duran 2023-11-30 23:28:21 +00:00 committed by Konstantin Belousov
parent ea99922484
commit 2f427cbb35

View file

@ -33,6 +33,7 @@
*/
#include <sys/types.h>
#include <ctype.h>
#include <errno.h>
#include <limits.h>
@ -57,7 +58,7 @@
/* internal macros */
#define PRINT(CH) do { \
if (dst >= s + maxsize) \
if (dst >= s + maxsize) \
goto e2big_error; \
*dst++ = CH; \
} while (0)
@ -68,9 +69,9 @@
PRINT(*tmps++); \
} while (0)
#define GET_NUMBER(VAR, LOC) do { \
#define GET_NUMBER(VAR, LOC) do { \
VAR = 0; \
while (isdigit_l((unsigned char)*fmt, LOC)) { \
while (isdigit_l((unsigned char)*fmt, LOC)) { \
if (VAR > INT_MAX / 10) \
goto e2big_error; \
VAR *= 10; \
@ -101,22 +102,22 @@ static char *__format_grouped_double(double, int *, int, int, int,
struct lconv *, locale_t);
static ssize_t
vstrfmon_l(char * __restrict s, size_t maxsize, locale_t loc,
const char * __restrict format, va_list ap)
vstrfmon_l(char *__restrict s, size_t maxsize, locale_t loc,
const char *__restrict format, va_list ap)
{
char *dst; /* output destination pointer */
const char *fmt; /* current format poistion pointer */
struct lconv *lc; /* pointer to lconv structure */
char *asciivalue; /* formatted double pointer */
int flags; /* formatting options */
int pad_char; /* padding character */
int pad_size; /* pad size */
int width; /* field width */
int left_prec; /* left precision */
int right_prec; /* right precision */
double value; /* just value */
char space_char = ' '; /* space after currency */
int flags; /* formatting options */
int pad_char; /* padding character */
int pad_size; /* pad size */
int width; /* field width */
int left_prec; /* left precision */
int right_prec; /* right precision */
double value; /* just value */
char space_char = ' '; /* space after currency */
char cs_precedes, /* values gathered from struct lconv */
sep_by_space,
@ -126,6 +127,7 @@ vstrfmon_l(char * __restrict s, size_t maxsize, locale_t loc,
char *tmpptr; /* temporary vars */
int sverrno;
FIX_LOCALE(loc);
lc = localeconv_l(loc);
@ -134,7 +136,7 @@ vstrfmon_l(char * __restrict s, size_t maxsize, locale_t loc,
asciivalue = NULL;
currency_symbol = NULL;
while (*fmt) {
while (*fmt != 0) {
/* pass nonformating characters AS IS */
if (*fmt != '%')
goto literal;
@ -144,13 +146,13 @@ vstrfmon_l(char * __restrict s, size_t maxsize, locale_t loc,
/* "%%" mean just '%' */
if (*(fmt + 1) == '%') {
fmt++;
literal:
literal:
PRINT(*fmt++);
continue;
}
/* set up initial values */
flags = (NEED_GROUPING|LOCALE_POSN);
flags = NEED_GROUPING | LOCALE_POSN;
pad_char = ' '; /* padding character is "space" */
pad_size = 0; /* no padding initially */
left_prec = -1; /* no left precision specified */
@ -160,32 +162,32 @@ vstrfmon_l(char * __restrict s, size_t maxsize, locale_t loc,
/* Flags */
while (1) {
switch (*++fmt) {
case '=': /* fill character */
pad_char = *++fmt;
if (pad_char == '\0')
goto format_error;
continue;
case '^': /* not group currency */
flags &= ~(NEED_GROUPING);
continue;
case '+': /* use locale defined signs */
if (flags & SIGN_POSN_USED)
goto format_error;
flags |= (SIGN_POSN_USED|LOCALE_POSN);
continue;
case '(': /* enclose negatives with () */
if (flags & SIGN_POSN_USED)
goto format_error;
flags |= (SIGN_POSN_USED|PARENTH_POSN);
continue;
case '!': /* suppress currency symbol */
flags |= SUPPRESS_CURR_SYMBOL;
continue;
case '-': /* alignment (left) */
flags |= LEFT_JUSTIFY;
continue;
default:
break;
case '=': /* fill character */
pad_char = *++fmt;
if (pad_char == '\0')
goto format_error;
continue;
case '^': /* not group currency */
flags &= ~(NEED_GROUPING);
continue;
case '+': /* use locale defined signs */
if (flags & SIGN_POSN_USED)
goto format_error;
flags |= (SIGN_POSN_USED | LOCALE_POSN);
continue;
case '(': /* enclose negatives with () */
if (flags & SIGN_POSN_USED)
goto format_error;
flags |= (SIGN_POSN_USED | PARENTH_POSN);
continue;
case '!': /* suppress currency symbol */
flags |= SUPPRESS_CURR_SYMBOL;
continue;
case '-': /* alignment (left) */
flags |= LEFT_JUSTIFY;
continue;
default:
break;
}
break;
}
@ -193,7 +195,8 @@ vstrfmon_l(char * __restrict s, size_t maxsize, locale_t loc,
/* field Width */
if (isdigit_l((unsigned char)*fmt, loc)) {
GET_NUMBER(width, loc);
/* Do we have enough space to put number with
/*
* Do we have enough space to put number with
* required width ?
*/
if ((unsigned int)width >= maxsize - (dst - s))
@ -214,22 +217,24 @@ vstrfmon_l(char * __restrict s, size_t maxsize, locale_t loc,
if (!isdigit_l((unsigned char)*++fmt, loc))
goto format_error;
GET_NUMBER(right_prec, loc);
if ((unsigned int)right_prec >= maxsize - (dst - s) -
left_prec)
if ((unsigned int)right_prec >=
maxsize - (dst - s) - left_prec)
goto e2big_error;
}
/* Conversion Characters */
switch (*fmt++) {
case 'i': /* use international currency format */
flags |= USE_INTL_CURRENCY;
break;
case 'n': /* use national currency format */
flags &= ~(USE_INTL_CURRENCY);
break;
default: /* required character is missing or
premature EOS */
goto format_error;
case 'i': /* use international currency format */
flags |= USE_INTL_CURRENCY;
break;
case 'n': /* use national currency format */
flags &= ~(USE_INTL_CURRENCY);
break;
default: /*
* required character is missing or
* premature EOS
*/
goto format_error;
}
if (currency_symbol != NULL)
@ -245,7 +250,7 @@ vstrfmon_l(char * __restrict s, size_t maxsize, locale_t loc,
currency_symbol = strdup(lc->currency_symbol);
if (currency_symbol == NULL)
goto end_error; /* ENOMEM. */
goto end_error; /* ENOMEM. */
/* value itself */
value = va_arg(ap, double);
@ -267,15 +272,17 @@ vstrfmon_l(char * __restrict s, size_t maxsize, locale_t loc,
if (asciivalue != NULL)
free(asciivalue);
asciivalue = __format_grouped_double(value, &flags,
left_prec, right_prec, pad_char, lc, loc);
asciivalue = __format_grouped_double(value, &flags, left_prec,
right_prec, pad_char, lc, loc);
if (asciivalue == NULL)
goto end_error; /* errno already set */
/* to ENOMEM by malloc() */
goto end_error; /*
* errno already set to ENOMEM by
* malloc()
*/
/* set some variables for later use */
__setup_vars(flags, &cs_precedes, &sep_by_space,
&sign_posn, &signstr, lc);
__setup_vars(flags, &cs_precedes, &sep_by_space, &sign_posn,
&signstr, lc);
/*
* Description of some LC_MONETARY's values:
@ -306,7 +313,6 @@ vstrfmon_l(char * __restrict s, size_t maxsize, locale_t loc,
* $currency_symbol
* = 3 - the sign string precedes the $currency_symbol
* = 4 - the sign string succeeds the $currency_symbol
*
*/
tmpptr = dst;
@ -352,12 +358,10 @@ vstrfmon_l(char * __restrict s, size_t maxsize, locale_t loc,
}
if (!(flags & SUPPRESS_CURR_SYMBOL)) {
if ((sign_posn == 3 && sep_by_space == 2)
|| (sep_by_space == 1
&& (sign_posn == 0
|| sign_posn == 1
|| sign_posn == 2
|| sign_posn == 4)))
if ((sign_posn == 3 && sep_by_space == 2) ||
(sep_by_space == 1 &&
(sign_posn == 0 || sign_posn == 1 ||
sign_posn == 2 || sign_posn == 4)))
PRINT(space_char);
PRINTS(currency_symbol);
if (sign_posn == 4) {
@ -398,7 +402,7 @@ vstrfmon_l(char * __restrict s, size_t maxsize, locale_t loc,
PRINT('\0');
free(asciivalue);
free(currency_symbol);
return (dst - s - 1); /* return size of put data except trailing '\0' */
return (dst - s - 1); /* size of put data except trailing '\0' */
e2big_error:
errno = E2BIG;
@ -418,15 +422,15 @@ end_error:
}
static void
__setup_vars(int flags, char *cs_precedes, char *sep_by_space,
char *sign_posn, char **signstr, struct lconv *lc)
__setup_vars(int flags, char *cs_precedes, char *sep_by_space, char *sign_posn,
char **signstr, struct lconv *lc)
{
if ((flags & IS_NEGATIVE) && (flags & USE_INTL_CURRENCY)) {
*cs_precedes = lc->int_n_cs_precedes;
*sep_by_space = lc->int_n_sep_by_space;
*sign_posn = (flags & PARENTH_POSN) ? 0 : lc->int_n_sign_posn;
*signstr = (lc->negative_sign[0] == '\0') ? "-"
: lc->negative_sign;
*signstr = (lc->negative_sign[0] == '\0') ? "-" :
lc->negative_sign;
} else if (flags & USE_INTL_CURRENCY) {
*cs_precedes = lc->int_p_cs_precedes;
*sep_by_space = lc->int_p_sep_by_space;
@ -436,8 +440,8 @@ __setup_vars(int flags, char *cs_precedes, char *sep_by_space,
*cs_precedes = lc->n_cs_precedes;
*sep_by_space = lc->n_sep_by_space;
*sign_posn = (flags & PARENTH_POSN) ? 0 : lc->n_sign_posn;
*signstr = (lc->negative_sign[0] == '\0') ? "-"
: lc->negative_sign;
*signstr = (lc->negative_sign[0] == '\0') ? "-" :
lc->negative_sign;
} else {
*cs_precedes = lc->p_cs_precedes;
*sep_by_space = lc->p_sep_by_space;
@ -460,8 +464,8 @@ __calc_left_pad(int flags, char *cur_symb, struct lconv *lc)
char cs_precedes, sep_by_space, sign_posn, *signstr;
int left_chars = 0;
__setup_vars(flags, &cs_precedes, &sep_by_space, &sign_posn,
&signstr, lc);
__setup_vars(flags, &cs_precedes, &sep_by_space, &sign_posn, &signstr,
lc);
if (cs_precedes != 0) {
left_chars += strlen(cur_symb);
@ -470,17 +474,17 @@ __calc_left_pad(int flags, char *cur_symb, struct lconv *lc)
}
switch (sign_posn) {
case 0:
if (flags & IS_NEGATIVE)
left_chars++;
break;
case 1:
case 0:
if (flags & IS_NEGATIVE)
left_chars++;
break;
case 1:
left_chars += strlen(signstr);
break;
case 3:
case 4:
if (cs_precedes != 0)
left_chars += strlen(signstr);
break;
case 3:
case 4:
if (cs_precedes != 0)
left_chars += strlen(signstr);
}
return (left_chars);
}
@ -510,8 +514,8 @@ get_groups(int size, char *grouping)
/* convert double to locale-encoded string */
static char *
__format_grouped_double(double value, int *flags,
int left_prec, int right_prec, int pad_char, struct lconv *lc, locale_t loc)
__format_grouped_double(double value, int *flags, int left_prec, int right_prec,
int pad_char, struct lconv *lc, locale_t loc)
{
char *rslt;
@ -529,7 +533,7 @@ __format_grouped_double(double value, int *flags,
size_t decimal_point_size;
size_t thousands_sep_size;
int groups = 0;
int groups = 0;
grouping = lc->mon_grouping;
decimal_point = lc->mon_decimal_point;
@ -592,10 +596,8 @@ __format_grouped_double(double value, int *flags,
avalue_size -= (right_prec + 1);
}
if ((*flags & NEED_GROUPING) &&
thousands_sep_size > 0 &&
*grouping != CHAR_MAX &&
*grouping > 0) {
if ((*flags & NEED_GROUPING) && thousands_sep_size > 0 &&
*grouping != CHAR_MAX && *grouping > 0) {
while (avalue_size > (int)*grouping) {
GRPCPY(*grouping);
GRPSEP;
@ -638,8 +640,7 @@ __format_grouped_double(double value, int *flags,
}
ssize_t
strfmon(char * __restrict s, size_t maxsize, const char * __restrict format,
...)
strfmon(char *__restrict s, size_t maxsize, const char *__restrict format, ...)
{
ssize_t ret;
va_list ap;
@ -652,8 +653,8 @@ strfmon(char * __restrict s, size_t maxsize, const char * __restrict format,
}
ssize_t
strfmon_l(char * __restrict s, size_t maxsize, locale_t loc,
const char * __restrict format, ...)
strfmon_l(char *__restrict s, size_t maxsize, locale_t loc,
const char *__restrict format, ...)
{
ssize_t ret;
va_list ap;