Loading...
--- Libc/Libc-1725.40.4/stdlib/NetBSD/strfmon.c
+++ Libc/Libc-583/stdlib/NetBSD/strfmon.c
@@ -1,4 +1,4 @@
-/* $NetBSD: strfmon.c,v 1.7 2009/01/30 23:46:03 lukem Exp $ */
+/* $NetBSD: strfmon.c,v 1.6 2008/03/27 21:50:30 christos Exp $ */
/*-
* Copyright (c) 2001 Alexey Zelkin <phantom@FreeBSD.org>
@@ -32,7 +32,7 @@
#if 0
__FBSDID("$FreeBSD: src/lib/libc/stdlib/strfmon.c,v 1.14 2003/03/20 08:18:55 ache Exp $");
#else
-__RCSID("$NetBSD: strfmon.c,v 1.7 2009/01/30 23:46:03 lukem Exp $");
+__RCSID("$NetBSD: strfmon.c,v 1.6 2008/03/27 21:50:30 christos Exp $");
#endif
#endif /* LIBC_SCCS and not lint */
@@ -40,8 +40,6 @@
#include "namespace.h"
#include <monetary.h>
#endif
-
-#include "xlocale_private.h"
#include <sys/types.h>
#include <ctype.h>
@@ -77,9 +75,9 @@
PRINT(*tmps++); \
} while (/* CONSTCOND */ 0)
-#define GET_NUMBER(VAR,LOC) do { \
+#define GET_NUMBER(VAR) do { \
VAR = 0; \
- while (isdigit_l((unsigned char)*fmt, (LOC))) { \
+ while (isdigit((unsigned char)*fmt)) { \
VAR *= 10; \
VAR += *fmt - '0'; \
if (VAR > 0x00ffffff) \
@@ -101,13 +99,15 @@
groups++; \
} while (/* CONSTCOND */ 0)
-static void __setup_vars(int, char *, char *, char *, const char **, struct lconv *);
-static int __calc_left_pad(int, char *, struct lconv *);
-static char *__format_grouped_double(double, int *, int, int, int, struct lconv *, locale_t);
-
-static ssize_t
-_strfmon(char * __restrict s, size_t maxsize, locale_t loc, const char * __restrict format, va_list ap)
+static void __setup_vars(int, char *, char *, char *, const char **);
+static int __calc_left_pad(int, char *);
+static char *__format_grouped_double(double, int *, int, int, int);
+
+ssize_t
+strfmon(char * __restrict s, size_t maxsize, 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 */
@@ -131,7 +131,9 @@
char *tmpptr; /* temporary vars */
int sverrno;
- lc = localeconv_l(loc);
+ va_start(ap, format);
+
+ lc = localeconv();
dst = s;
fmt = format;
asciivalue = NULL;
@@ -195,29 +197,29 @@
}
/* field Width */
- if (isdigit_l((unsigned char)*fmt, loc)) {
+ if (isdigit((unsigned char)*fmt)) {
ptrdiff_t d = dst - s;
- GET_NUMBER(width, loc);
+ GET_NUMBER(width);
/* Do we have enough space to put number with
* required width ?
*/
- if ((size_t)(d + width) >= maxsize)
+ if (d + width >= maxsize)
goto e2big_error;
}
/* Left precision */
if (*fmt == '#') {
- if (!isdigit_l((unsigned char)*++fmt, loc))
+ if (!isdigit((unsigned char)*++fmt))
goto format_error;
- GET_NUMBER(left_prec, loc);
+ GET_NUMBER(left_prec);
}
/* Right precision */
if (*fmt == '.') {
- if (!isdigit_l((unsigned char)*++fmt, loc))
+ if (!isdigit((unsigned char)*++fmt))
goto format_error;
- GET_NUMBER(right_prec, loc);
+ GET_NUMBER(right_prec);
}
/* Conversion Characters */
@@ -237,10 +239,8 @@
free(currency_symbol);
if (flags & USE_INTL_CURRENCY) {
currency_symbol = strdup(lc->int_curr_symbol);
- if (currency_symbol != NULL) {
+ if (currency_symbol != NULL)
space_char = *(currency_symbol+3);
- currency_symbol[3] = '\0';
- }
} else
currency_symbol = strdup(lc->currency_symbol);
@@ -259,21 +259,21 @@
/* fill left_prec with amount of padding chars */
if (left_prec >= 0) {
pad_size = __calc_left_pad((flags ^ IS_NEGATIVE),
- currency_symbol, lc) -
- __calc_left_pad(flags, currency_symbol, lc);
+ currency_symbol) -
+ __calc_left_pad(flags, currency_symbol);
if (pad_size < 0)
pad_size = 0;
}
asciivalue = __format_grouped_double(value, &flags,
- left_prec, right_prec, pad_char, lc, loc);
+ left_prec, right_prec, pad_char);
if (asciivalue == NULL)
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);
+ &sign_posn, &signstr);
/*
* Description of some LC_MONETARY's values:
@@ -333,11 +333,8 @@
} else if (sep_by_space == 1)
PRINT(space_char);
}
- } else if (sign_posn == 1) {
+ } else if (sign_posn == 1)
PRINTS(signstr);
- if (sep_by_space == 2)
- PRINT(' ');
- }
PRINTS(asciivalue);
@@ -371,12 +368,8 @@
PRINTS(signstr);
}
- if (sign_posn == 0) {
- if (flags & IS_NEGATIVE)
- PRINT(')');
- else if (left_prec >= 0)
- PRINT(' ');
- }
+ if (sign_posn == 0 && (flags & IS_NEGATIVE))
+ PRINT(')');
if (dst - tmpptr < width) {
if (flags & LEFT_JUSTIFY) {
@@ -393,6 +386,7 @@
}
PRINT('\0');
+ va_end(ap);
free(asciivalue);
free(currency_symbol);
return (dst - s - 1); /* return size of put data except trailing '\0' */
@@ -411,18 +405,20 @@
if (currency_symbol != NULL)
free(currency_symbol);
errno = sverrno;
+ va_end(ap);
return (-1);
}
static void
__setup_vars(int flags, char *cs_precedes, char *sep_by_space,
- char *sign_posn, const char **signstr, struct lconv *lc) {
+ char *sign_posn, const char **signstr) {
+ struct lconv *lc = localeconv();
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') ? "-"
+ *signstr = (lc->negative_sign == '\0') ? "-"
: lc->negative_sign;
} else if (flags & USE_INTL_CURRENCY) {
*cs_precedes = lc->int_p_cs_precedes;
@@ -433,7 +429,7 @@
*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') ? "-"
+ *signstr = (lc->negative_sign == '\0') ? "-"
: lc->negative_sign;
} else {
*cs_precedes = lc->p_cs_precedes;
@@ -452,13 +448,13 @@
}
static int
-__calc_left_pad(int flags, char *cur_symb, struct lconv *lc) {
+__calc_left_pad(int flags, char *cur_symb) {
char cs_precedes, sep_by_space, sign_posn;
const char *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);
if (cs_precedes != 0) {
left_chars += strlen(cur_symb);
@@ -467,10 +463,6 @@
}
switch (sign_posn) {
- case 0:
- if (flags & IS_NEGATIVE)
- left_chars++;
- break;
case 1:
left_chars += strlen(signstr);
break;
@@ -483,7 +475,7 @@
}
static int
-get_groups(int size, const char *grouping) {
+get_groups(int size, char *grouping) {
int chars = 0;
@@ -506,11 +498,9 @@
}
/* convert double to ASCII */
-__private_extern__ const char *__fix_nogrouping(const char *);
-
static char *
__format_grouped_double(double value, int *flags,
- int left_prec, int right_prec, int pad_char, struct lconv *lc, locale_t loc) {
+ int left_prec, int right_prec, int pad_char) {
char *rslt;
char *avalue;
@@ -522,13 +512,14 @@
int padded;
- const char *grouping;
+ struct lconv *lc = localeconv();
+ char *grouping;
char decimal_point;
char thousands_sep;
int groups = 0;
- grouping = __fix_nogrouping(lc->mon_grouping);
+ grouping = lc->mon_grouping;
decimal_point = *lc->mon_decimal_point;
if (decimal_point == '\0')
decimal_point = *lc->decimal_point;
@@ -555,9 +546,9 @@
left_prec += get_groups(left_prec, grouping);
/* convert to string */
- snprintf_l(fmt, sizeof(fmt), loc, "%%%d.%df", left_prec + right_prec + 1,
+ snprintf(fmt, sizeof(fmt), "%%%d.%df", left_prec + right_prec + 1,
right_prec);
- avalue_size = asprintf_l(&avalue, loc, fmt, value);
+ avalue_size = asprintf(&avalue, fmt, value);
if (avalue_size < 0)
return (NULL);
@@ -630,30 +621,3 @@
free(avalue);
return (rslt);
}
-
-ssize_t
-strfmon(char * __restrict s, size_t maxsize, const char * __restrict format,
- ...)
-{
- ssize_t ret;
- va_list ap;
-
- va_start(ap, format);
- ret = _strfmon(s, maxsize, __current_locale(), format, ap);
- va_end(ap);
- return ret;
-}
-
-ssize_t
-strfmon_l(char * __restrict s, size_t maxsize, locale_t loc,
- const char * __restrict format, ...)
-{
- ssize_t ret;
- va_list ap;
-
- NORMALIZE_LOCALE(loc);
- va_start(ap, format);
- ret = _strfmon(s, maxsize, loc, format, ap);
- va_end(ap);
- return ret;
-}