[BACK]Return to strfmon.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / libc / stdlib

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/lib/libc/stdlib/strfmon.c between version 1.8.2.1 and 1.13

version 1.8.2.1, 2012/04/17 00:05:25 version 1.13, 2017/11/27 23:54:28
Line 36  __RCSID("$NetBSD$");
Line 36  __RCSID("$NetBSD$");
 #endif  #endif
 #endif /* LIBC_SCCS and not lint */  #endif /* LIBC_SCCS and not lint */
   
 #if defined(__NetBSD__)  
 #include "namespace.h"  #include "namespace.h"
 #include <monetary.h>  
 #endif  
   
 #include <sys/types.h>  #include <sys/types.h>
 #include <assert.h>  #include <assert.h>
Line 47  __RCSID("$NetBSD$");
Line 44  __RCSID("$NetBSD$");
 #include <errno.h>  #include <errno.h>
 #include <limits.h>  #include <limits.h>
 #include <locale.h>  #include <locale.h>
   #include <monetary.h>
 #include <stdarg.h>  #include <stdarg.h>
   #include <stddef.h>
 #include <stdio.h>  #include <stdio.h>
 #include <stdlib.h>  #include <stdlib.h>
 #include <string.h>  #include <string.h>
 #include <stddef.h>  
   #include "setlocale_local.h"
   
 /* internal flags */  /* internal flags */
 #define NEED_GROUPING           0x01    /* print digits grouped (default) */  #define NEED_GROUPING           0x01    /* print digits grouped (default) */
Line 104  __RCSID("$NetBSD$");
Line 104  __RCSID("$NetBSD$");
         groups++;                                               \          groups++;                                               \
 } while (/* CONSTCOND */ 0)  } while (/* CONSTCOND */ 0)
   
 static void __setup_vars(int, char *, char *, char *, const char **);  static void __setup_vars(struct lconv *, int, char *, char *, char *, const char **);
 static int __calc_left_pad(int, char *);  static int __calc_left_pad(struct lconv *, int, char *);
 static char *__format_grouped_double(double, int *, int, int, int);  static char *__format_grouped_double(struct lconv *, double, int *, int, int, int);
   
 ssize_t  static ssize_t
 strfmon(char * __restrict s, size_t maxsize, const char * __restrict format,  vstrfmon_l(char * __restrict s, size_t maxsize, locale_t loc,
     ...)      const char * __restrict format, va_list ap)
 {  {
         va_list         ap;  
         char            *dst;           /* output destination pointer */          char            *dst;           /* output destination pointer */
         const char      *fmt;           /* current format poistion pointer */          const char      *fmt;           /* current format poistion pointer */
         struct lconv    *lc;            /* pointer to lconv structure */          struct lconv    *lc;            /* pointer to lconv structure */
Line 136  strfmon(char * __restrict s, size_t maxs
Line 135  strfmon(char * __restrict s, size_t maxs
         char            *tmpptr;        /* temporary vars */          char            *tmpptr;        /* temporary vars */
         int             sverrno;          int             sverrno;
   
         va_start(ap, format);          lc = localeconv_l(loc);
   
         lc = localeconv();  
         dst = s;          dst = s;
         fmt = format;          fmt = format;
         asciivalue = NULL;          asciivalue = NULL;
Line 244  strfmon(char * __restrict s, size_t maxs
Line 241  strfmon(char * __restrict s, size_t maxs
                         free(currency_symbol);                          free(currency_symbol);
                 if (flags & USE_INTL_CURRENCY) {                  if (flags & USE_INTL_CURRENCY) {
                         currency_symbol = strdup(lc->int_curr_symbol);                          currency_symbol = strdup(lc->int_curr_symbol);
                         if (currency_symbol != NULL)                          if (currency_symbol != NULL &&
                                 space_char = *(currency_symbol+3);                              strlen(currency_symbol) > 3) {
                                   space_char = currency_symbol[3];
                                   currency_symbol[3] = '\0';
                           }
   
                 } else                  } else
                         currency_symbol = strdup(lc->currency_symbol);                          currency_symbol = strdup(lc->currency_symbol);
   
Line 263  strfmon(char * __restrict s, size_t maxs
Line 264  strfmon(char * __restrict s, size_t maxs
   
                 /* fill left_prec with amount of padding chars */                  /* fill left_prec with amount of padding chars */
                 if (left_prec >= 0) {                  if (left_prec >= 0) {
                         pad_size = __calc_left_pad((flags ^ IS_NEGATIVE),                          pad_size = __calc_left_pad(lc, (flags ^ IS_NEGATIVE),
                                                         currency_symbol) -                                                          currency_symbol) -
                                    __calc_left_pad(flags, currency_symbol);                                     __calc_left_pad(lc, flags, currency_symbol);
                         if (pad_size < 0)                          if (pad_size < 0)
                                 pad_size = 0;                                  pad_size = 0;
                 }                  }
   
                 asciivalue = __format_grouped_double(value, &flags,                  asciivalue = __format_grouped_double(lc, value, &flags,
                                 left_prec, right_prec, pad_char);                                  left_prec, right_prec, pad_char);
                 if (asciivalue == NULL)                  if (asciivalue == NULL)
                         goto end_error;         /* errno already set     */                          goto end_error;         /* errno already set     */
                                                 /* to ENOMEM by malloc() */                                                  /* to ENOMEM by malloc() */
   
                 /* set some variables for later use */                  /* set some variables for later use */
                 __setup_vars(flags, &cs_precedes, &sep_by_space,                  __setup_vars(lc, flags, &cs_precedes, &sep_by_space,
                                 &sign_posn, &signstr);                                  &sign_posn, &signstr);
   
                 /*                  /*
Line 392  strfmon(char * __restrict s, size_t maxs
Line 393  strfmon(char * __restrict s, size_t maxs
         }          }
   
         PRINT('\0');          PRINT('\0');
         va_end(ap);  
         free(asciivalue);          free(asciivalue);
         free(currency_symbol);          free(currency_symbol);
         return (dst - s - 1);   /* return size of put data except trailing '\0' */          return (dst - s - 1);   /* return size of put data except trailing '\0' */
Line 411  end_error:
Line 411  end_error:
         if (currency_symbol != NULL)          if (currency_symbol != NULL)
                 free(currency_symbol);                  free(currency_symbol);
         errno = sverrno;          errno = sverrno;
         va_end(ap);  
         return (-1);          return (-1);
 }  }
   
 static void  static void
 __setup_vars(int flags, char *cs_precedes, char *sep_by_space,  __setup_vars(struct lconv *lc, int flags, char *cs_precedes, char *sep_by_space,
                 char *sign_posn, const char **signstr) {                  char *sign_posn, const char **signstr) {
         struct lconv *lc = localeconv();  
   
         if ((flags & IS_NEGATIVE) && (flags & USE_INTL_CURRENCY)) {          if ((flags & IS_NEGATIVE) && (flags & USE_INTL_CURRENCY)) {
                 *cs_precedes = lc->int_n_cs_precedes;                  *cs_precedes = lc->int_n_cs_precedes;
                 *sep_by_space = lc->int_n_sep_by_space;                  *sep_by_space = lc->int_n_sep_by_space;
                 *sign_posn = (flags & PARENTH_POSN) ? 0 : lc->int_n_sign_posn;                  *sign_posn = (flags & PARENTH_POSN) ? 0 : lc->int_n_sign_posn;
                 *signstr = (lc->negative_sign == '\0') ? "-"                  *signstr = (*lc->negative_sign == '\0') ? "-"
                     : lc->negative_sign;                      : lc->negative_sign;
         } else if (flags & USE_INTL_CURRENCY) {          } else if (flags & USE_INTL_CURRENCY) {
                 *cs_precedes = lc->int_p_cs_precedes;                  *cs_precedes = lc->int_p_cs_precedes;
Line 435  __setup_vars(int flags, char *cs_precede
Line 433  __setup_vars(int flags, char *cs_precede
                 *cs_precedes = lc->n_cs_precedes;                  *cs_precedes = lc->n_cs_precedes;
                 *sep_by_space = lc->n_sep_by_space;                  *sep_by_space = lc->n_sep_by_space;
                 *sign_posn = (flags & PARENTH_POSN) ? 0 : lc->n_sign_posn;                  *sign_posn = (flags & PARENTH_POSN) ? 0 : lc->n_sign_posn;
                 *signstr = (lc->negative_sign == '\0') ? "-"                  *signstr = (*lc->negative_sign == '\0') ? "-"
                     : lc->negative_sign;                      : lc->negative_sign;
         } else {          } else {
                 *cs_precedes = lc->p_cs_precedes;                  *cs_precedes = lc->p_cs_precedes;
Line 444  __setup_vars(int flags, char *cs_precede
Line 442  __setup_vars(int flags, char *cs_precede
                 *signstr = lc->positive_sign;                  *signstr = lc->positive_sign;
         }          }
   
         /* Set defult values for unspecified information. */          /* Set default values for unspecified information. */
         if (*cs_precedes != 0)          if (*cs_precedes != 0)
                 *cs_precedes = 1;                  *cs_precedes = 1;
         if ((unsigned char)*sep_by_space == NBCHAR_MAX)          if ((unsigned char)*sep_by_space == NBCHAR_MAX)
                 *sep_by_space = 0;                  *sep_by_space = 1;
         if ((unsigned char)*sign_posn == NBCHAR_MAX)          if ((unsigned char)*sign_posn == NBCHAR_MAX)
                 *sign_posn = 0;                  *sign_posn = 0;
 }  }
   
 static int  static int
 __calc_left_pad(int flags, char *cur_symb) {  __calc_left_pad(struct lconv *lc, int flags, char *cur_symb) {
   
         char cs_precedes, sep_by_space, sign_posn;          char cs_precedes, sep_by_space, sign_posn;
         const char *signstr;          const char *signstr;
         size_t left_chars = 0;          size_t left_chars = 0;
   
         __setup_vars(flags, &cs_precedes, &sep_by_space, &sign_posn, &signstr);          __setup_vars(lc, flags, &cs_precedes, &sep_by_space, &sign_posn, &signstr);
   
         if (cs_precedes != 0) {          if (cs_precedes != 0) {
                 left_chars += strlen(cur_symb);                  left_chars += strlen(cur_symb);
Line 506  get_groups(int size, char *grouping) {
Line 504  get_groups(int size, char *grouping) {
   
 /* convert double to ASCII */  /* convert double to ASCII */
 static char *  static char *
 __format_grouped_double(double value, int *flags,  __format_grouped_double(struct lconv *lc, double value, int *flags,
                         int left_prec, int right_prec, int pad_char) {                          int left_prec, int right_prec, int pad_char) {
   
         char            *rslt;          char            *rslt;
Line 518  __format_grouped_double(double value, in
Line 516  __format_grouped_double(double value, in
   
         int             padded;          int             padded;
   
         struct lconv    *lc = localeconv();  
         char            *grouping;          char            *grouping;
         char            decimal_point;          char            decimal_point;
         char            thousands_sep;          char            thousands_sep;
Line 559  __format_grouped_double(double value, in
Line 556  __format_grouped_double(double value, in
   
         /* make sure that we've enough space for result string */          /* make sure that we've enough space for result string */
         bufsize = avalue_size * 2 + 1;          bufsize = avalue_size * 2 + 1;
         rslt = malloc(bufsize);          rslt = calloc(1, bufsize);
         if (rslt == NULL) {          if (rslt == NULL) {
                 free(avalue);                  free(avalue);
                 return (NULL);                  return (NULL);
         }          }
         memset(rslt, 0, bufsize);  
         bufend = rslt + bufsize - 1;    /* reserve space for trailing '\0' */          bufend = rslt + bufsize - 1;    /* reserve space for trailing '\0' */
   
         /* skip spaces at beggining */          /* skip spaces at beggining */
Line 622  __format_grouped_double(double value, in
Line 618  __format_grouped_double(double value, in
                 memset(bufend, pad_char, (size_t) padded);                  memset(bufend, pad_char, (size_t) padded);
         }          }
   
         bufsize = bufsize - (bufend - rslt) + 1;          memmove(rslt, bufend, bufend - rslt + 1);
         memmove(rslt, bufend, bufsize);  
         free(avalue);          free(avalue);
         return (rslt);          return (rslt);
 }  }
   
   ssize_t
   strfmon(char * __restrict s, size_t maxsize, const char * __restrict format,
       ...)
   {
           ssize_t rv;
           va_list ap;
   
           va_start(ap, format);
           rv = vstrfmon_l(s, maxsize, _current_locale(), format, ap);
           va_end(ap);
   
           return rv;
   }
   
   ssize_t
   strfmon_l(char * __restrict s, size_t maxsize, locale_t loc,
       const char * __restrict format, ...)
   {
           ssize_t rv;
           va_list ap;
   
           va_start(ap, format);
           rv = vstrfmon_l(s, maxsize, loc, format, ap);
           va_end(ap);
   
           return rv;
   }

Legend:
Removed from v.1.8.2.1  
changed lines
  Added in v.1.13

CVSweb <webmaster@jp.NetBSD.org>