aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim J. Robbins <tjr@FreeBSD.org>2002-10-09 09:19:28 +0000
committerTim J. Robbins <tjr@FreeBSD.org>2002-10-09 09:19:28 +0000
commitf4da1a754daf3d4c20b8747729c0685cd2488bd6 (patch)
treee00be7aa17b3302ae9bae53d68968425f800ee09
parent16c1138c89ef7a738037fb976dd6b54797e5f88f (diff)
downloadsrc-f4da1a754daf3d4c20b8747729c0685cd2488bd6.tar.gz
src-f4da1a754daf3d4c20b8747729c0685cd2488bd6.zip
Add support for the 6 new C99 struct lconv members dealing with formatting
international monetary values: int_p_cs_precedes, int_n_cs_precedes, int_p_sep_by_space, int_n_sep_by_space, int_p_sign_posn, int_n_sign_posn. This should not break existing binaries or LC_MONETARY data files. Reviewed by: ache MFC after: 1 month
Notes
Notes: svn path=/head/; revision=104711
-rw-r--r--include/locale.h6
-rw-r--r--lib/libc/locale/lmonetary.c34
-rw-r--r--lib/libc/locale/lmonetary.h6
-rw-r--r--lib/libc/locale/localeconv.c6
-rw-r--r--lib/libc/locale/setlocale.334
5 files changed, 82 insertions, 4 deletions
diff --git a/include/locale.h b/include/locale.h
index 8b6ad4d65c74..2477db4a3af4 100644
--- a/include/locale.h
+++ b/include/locale.h
@@ -56,6 +56,12 @@ struct lconv {
char n_sep_by_space;
char p_sign_posn;
char n_sign_posn;
+ char int_p_cs_precedes;
+ char int_n_cs_precedes;
+ char int_p_sep_by_space;
+ char int_n_sep_by_space;
+ char int_p_sign_posn;
+ char int_n_sign_posn;
};
#ifndef NULL
diff --git a/lib/libc/locale/lmonetary.c b/lib/libc/locale/lmonetary.c
index 3dc6df0884a7..ad751f27ee6a 100644
--- a/lib/libc/locale/lmonetary.c
+++ b/lib/libc/locale/lmonetary.c
@@ -28,6 +28,7 @@
__FBSDID("$FreeBSD$");
#include <limits.h>
+#include <stddef.h>
#include <stdlib.h>
#include "lmonetary.h"
#include "ldpart.h"
@@ -55,7 +56,13 @@ static const struct lc_monetary_T _C_monetary_locale = {
numempty, /* n_cs_precedes */
numempty, /* n_sep_by_space */
numempty, /* p_sign_posn */
- numempty /* n_sign_posn */
+ numempty, /* n_sign_posn */
+ numempty, /* int_p_cs_precedes */
+ numempty, /* int_n_cs_precedes */
+ numempty, /* int_p_sep_by_space */
+ numempty, /* int_n_sep_by_space */
+ numempty, /* int_p_sign_posn */
+ numempty /* int_n_sign_posn */
};
static struct lc_monetary_T _monetary_locale;
@@ -79,7 +86,9 @@ __monetary_load_locale(const char *name)
ret = __part_load_locale(name, &_monetary_using_locale,
_monetary_locale_buf, "LC_MONETARY",
- LCMONETARY_SIZE, LCMONETARY_SIZE,
+ LCMONETARY_SIZE,
+ offsetof(struct lc_monetary_T, int_p_cs_precedes) /
+ sizeof(char *),
(const char **)&_monetary_locale);
if (ret != _LDP_ERROR)
__mlocale_changed = 1;
@@ -98,6 +107,27 @@ __monetary_load_locale(const char *name)
M_ASSIGN_CHAR(n_sep_by_space);
M_ASSIGN_CHAR(p_sign_posn);
M_ASSIGN_CHAR(n_sign_posn);
+
+ /*
+ * The six additional C99 international monetary formatting
+ * parameters default to the national parameters when
+ * reading FreeBSD 4 LC_MONETARY data files.
+ */
+#define M_ASSIGN_ICHAR(NAME) \
+ do { \
+ if (_monetary_locale.int_##NAME == NULL) \
+ _monetary_locale.int_##NAME = \
+ _monetary_locale.NAME; \
+ else \
+ M_ASSIGN_CHAR(int_##NAME); \
+ } while (0)
+
+ M_ASSIGN_ICHAR(p_cs_precedes);
+ M_ASSIGN_ICHAR(n_cs_precedes);
+ M_ASSIGN_ICHAR(p_sep_by_space);
+ M_ASSIGN_ICHAR(n_sep_by_space);
+ M_ASSIGN_ICHAR(p_sign_posn);
+ M_ASSIGN_ICHAR(n_sign_posn);
}
return (ret);
}
diff --git a/lib/libc/locale/lmonetary.h b/lib/libc/locale/lmonetary.h
index d32689793922..45ec3235b578 100644
--- a/lib/libc/locale/lmonetary.h
+++ b/lib/libc/locale/lmonetary.h
@@ -45,6 +45,12 @@ struct lc_monetary_T {
const char *n_sep_by_space;
const char *p_sign_posn;
const char *n_sign_posn;
+ const char *int_p_cs_precedes;
+ const char *int_n_cs_precedes;
+ const char *int_p_sep_by_space;
+ const char *int_n_sep_by_space;
+ const char *int_p_sign_posn;
+ const char *int_n_sign_posn;
};
struct lc_monetary_T *__get_current_monetary_locale(void);
diff --git a/lib/libc/locale/localeconv.c b/lib/libc/locale/localeconv.c
index 804e9fdad08e..d10ba1f97427 100644
--- a/lib/libc/locale/localeconv.c
+++ b/lib/libc/locale/localeconv.c
@@ -85,6 +85,12 @@ localeconv()
M_ASSIGN_CHAR(n_sep_by_space);
M_ASSIGN_CHAR(p_sign_posn);
M_ASSIGN_CHAR(n_sign_posn);
+ M_ASSIGN_CHAR(int_p_cs_precedes);
+ M_ASSIGN_CHAR(int_n_cs_precedes);
+ M_ASSIGN_CHAR(int_p_sep_by_space);
+ M_ASSIGN_CHAR(int_n_sep_by_space);
+ M_ASSIGN_CHAR(int_p_sign_posn);
+ M_ASSIGN_CHAR(int_n_sign_posn);
__mlocale_changed = 0;
}
diff --git a/lib/libc/locale/setlocale.3 b/lib/libc/locale/setlocale.3
index a1bb367bd7b1..75808672a823 100644
--- a/lib/libc/locale/setlocale.3
+++ b/lib/libc/locale/setlocale.3
@@ -35,7 +35,7 @@
.\" @(#)setlocale.3 8.1 (Berkeley) 6/9/93
.\" $FreeBSD$
.\"
-.Dd June 9, 1993
+.Dd October 5, 2002
.Dt SETLOCALE 3
.Os
.Sh NAME
@@ -163,6 +163,12 @@ struct lconv {
char n_sep_by_space;
char p_sign_posn;
char n_sign_posn;
+ char int_p_cs_precedes;
+ char int_n_cs_precedes;
+ char int_p_sep_by_space;
+ char int_n_sep_by_space;
+ char int_p_sign_posn;
+ char int_n_sign_posn;
};
.Ed
.Pp
@@ -249,6 +255,30 @@ Just after
Like
.Fa p_sign_posn
but for negative currency values.
+.It Fa int_p_cs_precedes
+Same as
+.Fa p_cs_precedes ,
+but for internationally formatted monetary quantities.
+.It Fa int_n_cs_precedes
+Same as
+.Fa n_cs_precedes ,
+but for internationally formatted monetary quantities.
+.It Fa int_p_sep_by_space
+Same as
+.Fa p_sep_by_space ,
+but for internationally formatted monetary quantities.
+.It Fa int_n_sep_by_space
+Same as
+.Fa n_sep_by_space ,
+but for internationally formatted monetary quantities.
+.It Fa int_p_sign_posn
+Same as
+.Fa p_sign_posn ,
+but for internationally formatted monetary quantities.
+.It Fa int_n_sign_posn
+Same as
+.Fa n_sign_posn ,
+but for internationally formatted monetary quantities.
.El
.Pp
Unless mentioned above,
@@ -311,7 +341,7 @@ The
and
.Fn localeconv
functions conform to
-.St -isoC .
+.St -isoC-99 .
.Sh HISTORY
The
.Fn setlocale