diff options
-rw-r--r-- | ChangeLog | 32 | ||||
-rw-r--r-- | localedata/Makefile | 5 | ||||
-rw-r--r-- | localedata/tst-fmon-locales/tstfmon_n01y12 | 28 | ||||
-rw-r--r-- | localedata/tst-fmon-locales/tstfmon_n02n40 | 28 | ||||
-rw-r--r-- | localedata/tst-fmon-locales/tstfmon_n10y31 | 28 | ||||
-rw-r--r-- | localedata/tst-fmon-locales/tstfmon_n11y41 | 28 | ||||
-rw-r--r-- | localedata/tst-fmon-locales/tstfmon_n12y11 | 28 | ||||
-rw-r--r-- | localedata/tst-fmon-locales/tstfmon_n20n32 | 28 | ||||
-rw-r--r-- | localedata/tst-fmon-locales/tstfmon_n30y20 | 28 | ||||
-rw-r--r-- | localedata/tst-fmon-locales/tstfmon_n41n00 | 28 | ||||
-rw-r--r-- | localedata/tst-fmon-locales/tstfmon_y01y10 | 28 | ||||
-rw-r--r-- | localedata/tst-fmon-locales/tstfmon_y02n22 | 28 | ||||
-rw-r--r-- | localedata/tst-fmon-locales/tstfmon_y22n42 | 28 | ||||
-rw-r--r-- | localedata/tst-fmon-locales/tstfmon_y30y21 | 28 | ||||
-rw-r--r-- | localedata/tst-fmon-locales/tstfmon_y32n31 | 28 | ||||
-rw-r--r-- | localedata/tst-fmon-locales/tstfmon_y40y00 | 28 | ||||
-rw-r--r-- | localedata/tst-fmon-locales/tstfmon_y42n21 | 28 | ||||
-rw-r--r-- | localedata/tst-fmon.data | 111 | ||||
-rwxr-xr-x | localedata/tst-fmon.sh | 20 | ||||
-rw-r--r-- | stdlib/strfmon.c | 102 |
20 files changed, 643 insertions, 47 deletions
@@ -1,3 +1,35 @@ +2000-04-09 Ulrich Drepper <drepper@redhat.com> + + * localedata/Makefile: Add rules to clean up directories created by + new strfmon tests. + +2000-04-09 Geoff Clare <gwc@unisoft.com> + + * localedata/tst-fmon.data: Added new tests for strfmon() + using test locales with all combinations of cs_precedes, + sign_posn and sep_by_space. + * localedata/tst-fmon.sh: Updated to support the new tests. + * localedata/tst-fmon-locales/tstfmon_n01y12: New file containing + the localedef source for the new strfmon() test locale. + * localedata/tst-fmon-locales/tstfmon_n02n40: Likewise. + * localedata/tst-fmon-locales/tstfmon_n10y31: Likewise. + * localedata/tst-fmon-locales/tstfmon_n11y41: Likewise. + * localedata/tst-fmon-locales/tstfmon_n12y11: Likewise. + * localedata/tst-fmon-locales/tstfmon_n20n32: Likewise. + * localedata/tst-fmon-locales/tstfmon_n30y20: Likewise. + * localedata/tst-fmon-locales/tstfmon_n41n00: Likewise. + * localedata/tst-fmon-locales/tstfmon_y01y10: Likewise. + * localedata/tst-fmon-locales/tstfmon_y02n22: Likewise. + * localedata/tst-fmon-locales/tstfmon_y22n42: Likewise. + * localedata/tst-fmon-locales/tstfmon_y30y21: Likewise. + * localedata/tst-fmon-locales/tstfmon_y32n31: Likewise. + * localedata/tst-fmon-locales/tstfmon_y40y00: Likewise. + * localedata/tst-fmon-locales/tstfmon_y42n21: Likewise. + + * stdlib/strfmon.c: Correct problems with missing or extra + spaces for unusual combinations of sign_posn and sep_by_space. + Improved left-precision alignment code. + 2000-04-07 Andreas Jaeger <aj@suse.de> * posix/Makefile (CFLAGS-regex.c): Remove DEBUG. diff --git a/localedata/Makefile b/localedata/Makefile index 928d96a0bc..7e211699a8 100644 --- a/localedata/Makefile +++ b/localedata/Makefile @@ -45,9 +45,12 @@ ld-test-names := test1 test2 test3 test4 test5 ld-test-srcs := $(addprefix tests/,$(addsuffix .cm,$(ld-test-names)) \ $(addsuffix .def,$(ld-test-names))) +fmon-tests = n01y12 n02n40 n10y31 n11y41 n12y11 n20n32 n30y20 n41n00 \ + y01y10 y02n22 y22n42 y30y21 y32n31 y40y00 y42n21 + generated := $(test-input) $(test-output) generated-dirs := $(basename $(test-input)) en_US $(ld-test-names) tt_TT\ - de_DE.437 + de_DE.437 $(addprefix tstfmon_,$(fmon-tests)) distribute := CHECKSUMS README SUPPORTED ChangeLog \ $(charmaps) $(locales) $(repertoiremaps) \ diff --git a/localedata/tst-fmon-locales/tstfmon_n01y12 b/localedata/tst-fmon-locales/tstfmon_n01y12 new file mode 100644 index 0000000000..f8fac3ca30 --- /dev/null +++ b/localedata/tst-fmon-locales/tstfmon_n01y12 @@ -0,0 +1,28 @@ +repertoiremap mnemonic.ds + +# One of a set of test locales for strfmon() + +# The six characters after the "_" in the locale name indicate +# the last six LC_MONETARY values below. + +LC_CTYPE +copy "POSIX" +END LC_CTYPE + +LC_MONETARY +int_curr_symbol "<U><S><D><SP>" +currency_symbol "<DO>" +mon_decimal_point "<.>" +mon_thousands_sep "<,>" +mon_grouping 3;3 +positive_sign "<+>" +negative_sign "<->" +int_frac_digits 2 +frac_digits 2 +p_cs_precedes 0 +p_sign_posn 0 +p_sep_by_space 1 +n_cs_precedes 1 +n_sign_posn 1 +n_sep_by_space 2 +END LC_MONETARY diff --git a/localedata/tst-fmon-locales/tstfmon_n02n40 b/localedata/tst-fmon-locales/tstfmon_n02n40 new file mode 100644 index 0000000000..be9ecf374f --- /dev/null +++ b/localedata/tst-fmon-locales/tstfmon_n02n40 @@ -0,0 +1,28 @@ +repertoiremap mnemonic.ds + +# One of a set of test locales for strfmon() + +# The six characters after the "_" in the locale name indicate +# the last six LC_MONETARY values below. + +LC_CTYPE +copy "POSIX" +END LC_CTYPE + +LC_MONETARY +int_curr_symbol "<U><S><D><SP>" +currency_symbol "<DO>" +mon_decimal_point "<.>" +mon_thousands_sep "<,>" +mon_grouping 3;3 +positive_sign "<+>" +negative_sign "<->" +int_frac_digits 2 +frac_digits 2 +p_cs_precedes 0 +p_sign_posn 0 +p_sep_by_space 2 +n_cs_precedes 0 +n_sign_posn 4 +n_sep_by_space 0 +END LC_MONETARY diff --git a/localedata/tst-fmon-locales/tstfmon_n10y31 b/localedata/tst-fmon-locales/tstfmon_n10y31 new file mode 100644 index 0000000000..47fe7b4241 --- /dev/null +++ b/localedata/tst-fmon-locales/tstfmon_n10y31 @@ -0,0 +1,28 @@ +repertoiremap mnemonic.ds + +# One of a set of test locales for strfmon() + +# The six characters after the "_" in the locale name indicate +# the last six LC_MONETARY values below. + +LC_CTYPE +copy "POSIX" +END LC_CTYPE + +LC_MONETARY +int_curr_symbol "<U><S><D><SP>" +currency_symbol "<DO>" +mon_decimal_point "<.>" +mon_thousands_sep "<,>" +mon_grouping 3;3 +positive_sign "<+>" +negative_sign "<->" +int_frac_digits 2 +frac_digits 2 +p_cs_precedes 0 +p_sign_posn 1 +p_sep_by_space 0 +n_cs_precedes 1 +n_sign_posn 3 +n_sep_by_space 1 +END LC_MONETARY diff --git a/localedata/tst-fmon-locales/tstfmon_n11y41 b/localedata/tst-fmon-locales/tstfmon_n11y41 new file mode 100644 index 0000000000..3a7f5dcf7f --- /dev/null +++ b/localedata/tst-fmon-locales/tstfmon_n11y41 @@ -0,0 +1,28 @@ +repertoiremap mnemonic.ds + +# One of a set of test locales for strfmon() + +# The six characters after the "_" in the locale name indicate +# the last six LC_MONETARY values below. + +LC_CTYPE +copy "POSIX" +END LC_CTYPE + +LC_MONETARY +int_curr_symbol "<U><S><D><SP>" +currency_symbol "<DO>" +mon_decimal_point "<.>" +mon_thousands_sep "<,>" +mon_grouping 3;3 +positive_sign "<+>" +negative_sign "<->" +int_frac_digits 2 +frac_digits 2 +p_cs_precedes 0 +p_sign_posn 1 +p_sep_by_space 1 +n_cs_precedes 1 +n_sign_posn 4 +n_sep_by_space 1 +END LC_MONETARY diff --git a/localedata/tst-fmon-locales/tstfmon_n12y11 b/localedata/tst-fmon-locales/tstfmon_n12y11 new file mode 100644 index 0000000000..c8cb113ffc --- /dev/null +++ b/localedata/tst-fmon-locales/tstfmon_n12y11 @@ -0,0 +1,28 @@ +repertoiremap mnemonic.ds + +# One of a set of test locales for strfmon() + +# The six characters after the "_" in the locale name indicate +# the last six LC_MONETARY values below. + +LC_CTYPE +copy "POSIX" +END LC_CTYPE + +LC_MONETARY +int_curr_symbol "<U><S><D><SP>" +currency_symbol "<DO>" +mon_decimal_point "<.>" +mon_thousands_sep "<,>" +mon_grouping 3;3 +positive_sign "<+>" +negative_sign "<->" +int_frac_digits 2 +frac_digits 2 +p_cs_precedes 0 +p_sign_posn 1 +p_sep_by_space 2 +n_cs_precedes 1 +n_sign_posn 1 +n_sep_by_space 1 +END LC_MONETARY diff --git a/localedata/tst-fmon-locales/tstfmon_n20n32 b/localedata/tst-fmon-locales/tstfmon_n20n32 new file mode 100644 index 0000000000..679d1fe9a6 --- /dev/null +++ b/localedata/tst-fmon-locales/tstfmon_n20n32 @@ -0,0 +1,28 @@ +repertoiremap mnemonic.ds + +# One of a set of test locales for strfmon() + +# The six characters after the "_" in the locale name indicate +# the last six LC_MONETARY values below. + +LC_CTYPE +copy "POSIX" +END LC_CTYPE + +LC_MONETARY +int_curr_symbol "<U><S><D><SP>" +currency_symbol "<DO>" +mon_decimal_point "<.>" +mon_thousands_sep "<,>" +mon_grouping 3;3 +positive_sign "<+>" +negative_sign "<->" +int_frac_digits 2 +frac_digits 2 +p_cs_precedes 0 +p_sign_posn 2 +p_sep_by_space 0 +n_cs_precedes 0 +n_sign_posn 3 +n_sep_by_space 2 +END LC_MONETARY diff --git a/localedata/tst-fmon-locales/tstfmon_n30y20 b/localedata/tst-fmon-locales/tstfmon_n30y20 new file mode 100644 index 0000000000..4d7f761078 --- /dev/null +++ b/localedata/tst-fmon-locales/tstfmon_n30y20 @@ -0,0 +1,28 @@ +repertoiremap mnemonic.ds + +# One of a set of test locales for strfmon() + +# The six characters after the "_" in the locale name indicate +# the last six LC_MONETARY values below. + +LC_CTYPE +copy "POSIX" +END LC_CTYPE + +LC_MONETARY +int_curr_symbol "<U><S><D><SP>" +currency_symbol "<DO>" +mon_decimal_point "<.>" +mon_thousands_sep "<,>" +mon_grouping 3;3 +positive_sign "<+>" +negative_sign "<->" +int_frac_digits 2 +frac_digits 2 +p_cs_precedes 0 +p_sign_posn 3 +p_sep_by_space 0 +n_cs_precedes 1 +n_sign_posn 2 +n_sep_by_space 0 +END LC_MONETARY diff --git a/localedata/tst-fmon-locales/tstfmon_n41n00 b/localedata/tst-fmon-locales/tstfmon_n41n00 new file mode 100644 index 0000000000..c50cd5642c --- /dev/null +++ b/localedata/tst-fmon-locales/tstfmon_n41n00 @@ -0,0 +1,28 @@ +repertoiremap mnemonic.ds + +# One of a set of test locales for strfmon() + +# The six characters after the "_" in the locale name indicate +# the last six LC_MONETARY values below. + +LC_CTYPE +copy "POSIX" +END LC_CTYPE + +LC_MONETARY +int_curr_symbol "<U><S><D><SP>" +currency_symbol "<DO>" +mon_decimal_point "<.>" +mon_thousands_sep "<,>" +mon_grouping 3;3 +positive_sign "<+>" +negative_sign "<->" +int_frac_digits 2 +frac_digits 2 +p_cs_precedes 0 +p_sign_posn 4 +p_sep_by_space 1 +n_cs_precedes 0 +n_sign_posn 0 +n_sep_by_space 0 +END LC_MONETARY diff --git a/localedata/tst-fmon-locales/tstfmon_y01y10 b/localedata/tst-fmon-locales/tstfmon_y01y10 new file mode 100644 index 0000000000..fa3dffec88 --- /dev/null +++ b/localedata/tst-fmon-locales/tstfmon_y01y10 @@ -0,0 +1,28 @@ +repertoiremap mnemonic.ds + +# One of a set of test locales for strfmon() + +# The six characters after the "_" in the locale name indicate +# the last six LC_MONETARY values below. + +LC_CTYPE +copy "POSIX" +END LC_CTYPE + +LC_MONETARY +int_curr_symbol "<U><S><D><SP>" +currency_symbol "<DO>" +mon_decimal_point "<.>" +mon_thousands_sep "<,>" +mon_grouping 3;3 +positive_sign "<+>" +negative_sign "<->" +int_frac_digits 2 +frac_digits 2 +p_cs_precedes 1 +p_sign_posn 0 +p_sep_by_space 1 +n_cs_precedes 1 +n_sign_posn 1 +n_sep_by_space 0 +END LC_MONETARY diff --git a/localedata/tst-fmon-locales/tstfmon_y02n22 b/localedata/tst-fmon-locales/tstfmon_y02n22 new file mode 100644 index 0000000000..9a1dd61a13 --- /dev/null +++ b/localedata/tst-fmon-locales/tstfmon_y02n22 @@ -0,0 +1,28 @@ +repertoiremap mnemonic.ds + +# One of a set of test locales for strfmon() + +# The six characters after the "_" in the locale name indicate +# the last six LC_MONETARY values below. + +LC_CTYPE +copy "POSIX" +END LC_CTYPE + +LC_MONETARY +int_curr_symbol "<U><S><D><SP>" +currency_symbol "<DO>" +mon_decimal_point "<.>" +mon_thousands_sep "<,>" +mon_grouping 3;3 +positive_sign "" +negative_sign "<O></><D>" +int_frac_digits 2 +frac_digits 2 +p_cs_precedes 1 +p_sign_posn 0 +p_sep_by_space 2 +n_cs_precedes 0 +n_sign_posn 2 +n_sep_by_space 2 +END LC_MONETARY diff --git a/localedata/tst-fmon-locales/tstfmon_y22n42 b/localedata/tst-fmon-locales/tstfmon_y22n42 new file mode 100644 index 0000000000..f12d533914 --- /dev/null +++ b/localedata/tst-fmon-locales/tstfmon_y22n42 @@ -0,0 +1,28 @@ +repertoiremap mnemonic.ds + +# One of a set of test locales for strfmon() + +# The six characters after the "_" in the locale name indicate +# the last six LC_MONETARY values below. + +LC_CTYPE +copy "POSIX" +END LC_CTYPE + +LC_MONETARY +int_curr_symbol "<U><S><D><SP>" +currency_symbol "<DO>" +mon_decimal_point "<.>" +mon_thousands_sep "<,>" +mon_grouping 3;3 +positive_sign "<+>" +negative_sign "<->" +int_frac_digits 2 +frac_digits 2 +p_cs_precedes 1 +p_sign_posn 2 +p_sep_by_space 2 +n_cs_precedes 0 +n_sign_posn 4 +n_sep_by_space 2 +END LC_MONETARY diff --git a/localedata/tst-fmon-locales/tstfmon_y30y21 b/localedata/tst-fmon-locales/tstfmon_y30y21 new file mode 100644 index 0000000000..d7775833dd --- /dev/null +++ b/localedata/tst-fmon-locales/tstfmon_y30y21 @@ -0,0 +1,28 @@ +repertoiremap mnemonic.ds + +# One of a set of test locales for strfmon() + +# The six characters after the "_" in the locale name indicate +# the last six LC_MONETARY values below. + +LC_CTYPE +copy "POSIX" +END LC_CTYPE + +LC_MONETARY +int_curr_symbol "<U><S><D><SP>" +currency_symbol "<DO>" +mon_decimal_point "<.>" +mon_thousands_sep "<,>" +mon_grouping 3;3 +positive_sign "<+>" +negative_sign "<->" +int_frac_digits 2 +frac_digits 2 +p_cs_precedes 1 +p_sign_posn 3 +p_sep_by_space 0 +n_cs_precedes 1 +n_sign_posn 2 +n_sep_by_space 1 +END LC_MONETARY diff --git a/localedata/tst-fmon-locales/tstfmon_y32n31 b/localedata/tst-fmon-locales/tstfmon_y32n31 new file mode 100644 index 0000000000..093341ca46 --- /dev/null +++ b/localedata/tst-fmon-locales/tstfmon_y32n31 @@ -0,0 +1,28 @@ +repertoiremap mnemonic.ds + +# One of a set of test locales for strfmon() + +# The six characters after the "_" in the locale name indicate +# the last six LC_MONETARY values below. + +LC_CTYPE +copy "POSIX" +END LC_CTYPE + +LC_MONETARY +int_curr_symbol "<U><S><D><SP>" +currency_symbol "<DO>" +mon_decimal_point "<.>" +mon_thousands_sep "<,>" +mon_grouping 3;3 +positive_sign "<+>" +negative_sign "<->" +int_frac_digits 2 +frac_digits 2 +p_cs_precedes 1 +p_sign_posn 3 +p_sep_by_space 2 +n_cs_precedes 0 +n_sign_posn 3 +n_sep_by_space 1 +END LC_MONETARY diff --git a/localedata/tst-fmon-locales/tstfmon_y40y00 b/localedata/tst-fmon-locales/tstfmon_y40y00 new file mode 100644 index 0000000000..5e4cf12b2a --- /dev/null +++ b/localedata/tst-fmon-locales/tstfmon_y40y00 @@ -0,0 +1,28 @@ +repertoiremap mnemonic.ds + +# One of a set of test locales for strfmon() + +# The six characters after the "_" in the locale name indicate +# the last six LC_MONETARY values below. + +LC_CTYPE +copy "POSIX" +END LC_CTYPE + +LC_MONETARY +int_curr_symbol "<U><S><D><SP>" +currency_symbol "<DO>" +mon_decimal_point "<.>" +mon_thousands_sep "<,>" +mon_grouping 3;3 +positive_sign "<+>" +negative_sign "<->" +int_frac_digits 2 +frac_digits 2 +p_cs_precedes 1 +p_sign_posn 4 +p_sep_by_space 0 +n_cs_precedes 1 +n_sign_posn 0 +n_sep_by_space 0 +END LC_MONETARY diff --git a/localedata/tst-fmon-locales/tstfmon_y42n21 b/localedata/tst-fmon-locales/tstfmon_y42n21 new file mode 100644 index 0000000000..3dcf4a38d8 --- /dev/null +++ b/localedata/tst-fmon-locales/tstfmon_y42n21 @@ -0,0 +1,28 @@ +repertoiremap mnemonic.ds + +# One of a set of test locales for strfmon() + +# The six characters after the "_" in the locale name indicate +# the last six LC_MONETARY values below. + +LC_CTYPE +copy "POSIX" +END LC_CTYPE + +LC_MONETARY +int_curr_symbol "<U><S><D><SP>" +currency_symbol "<DO>" +mon_decimal_point "<.>" +mon_thousands_sep "<,>" +mon_grouping 3;3 +positive_sign "<+>" +negative_sign "<->" +int_frac_digits 2 +frac_digits 2 +p_cs_precedes 1 +p_sign_posn 4 +p_sep_by_space 2 +n_cs_precedes 0 +n_sign_posn 2 +n_sep_by_space 1 +END LC_MONETARY diff --git a/localedata/tst-fmon.data b/localedata/tst-fmon.data index f70dea0318..f1084ca685 100644 --- a/localedata/tst-fmon.data +++ b/localedata/tst-fmon.data @@ -19,7 +19,7 @@ # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # The format of this file is pretty simple: Each line contains a test -# for strfmon. Fields are seperated by TABs. Lines that start with a +# for strfmon. Fields are separated by TABs. Lines that start with a # '#' are comments and are ignored. # # Field Description @@ -126,3 +126,112 @@ en_US.ISO-8859-1 %!(#5n 3456.781 3,456.78 en_US.ISO-8859-1 %#5n 123.45 $ 123.45 en_US.ISO-8859-1 %#5n -123.45 -$ 123.45 en_US.ISO-8859-1 %#5n 3456.781 $ 3,456.78 +# +# check all cs_precedes/sign_posn/sep_by_space combinations using +# special test locales. The six characters after the "_" indicate +# these three values for positive and then negative quantities. +# +tstfmon_n01y12 %n 123.45 123.45 $ +tstfmon_n01y12 %n -123.45 - $123.45 +tstfmon_n01y12 %11n 123.45 123.45 $ +tstfmon_n01y12 %11n -123.45 - $123.45 +tstfmon_n01y12 %^=*#5n 123.45 **123.45 $ +tstfmon_n01y12 %^=*#5n -123.45 - $**123.45 +# +tstfmon_n02n40 %n 123.45 123.45$ +tstfmon_n02n40 %n -123.45 123.45$- +tstfmon_n02n40 %11n 123.45 123.45$ +tstfmon_n02n40 %11n -123.45 123.45$- +tstfmon_n02n40 %^=*#5n 123.45 **123.45$ +tstfmon_n02n40 %^=*#5n -123.45 **123.45$- +# +tstfmon_n10y31 %n 123.45 +123.45$ +tstfmon_n10y31 %n -123.45 -$ 123.45 +tstfmon_n10y31 %11n 123.45 +123.45$ +tstfmon_n10y31 %11n -123.45 -$ 123.45 +tstfmon_n10y31 %^=*#5n 123.45 +**123.45$ +tstfmon_n10y31 %^=*#5n -123.45 -$ **123.45 +# +tstfmon_n11y41 %n 123.45 +123.45 $ +tstfmon_n11y41 %n -123.45 $- 123.45 +tstfmon_n11y41 %11n 123.45 +123.45 $ +tstfmon_n11y41 %11n -123.45 $- 123.45 +tstfmon_n11y41 %^=*#5n 123.45 +**123.45 $ +tstfmon_n11y41 %^=*#5n -123.45 $- **123.45 +# +tstfmon_n12y11 %n 123.45 +123.45$ +tstfmon_n12y11 %n -123.45 -$ 123.45 +tstfmon_n12y11 %11n 123.45 +123.45$ +tstfmon_n12y11 %11n -123.45 -$ 123.45 +tstfmon_n12y11 %^=*#5n 123.45 +**123.45$ +tstfmon_n12y11 %^=*#5n -123.45 -$ **123.45 +# +tstfmon_n20n32 %n 123.45 123.45$+ +tstfmon_n20n32 %n -123.45 123.45- $ +tstfmon_n20n32 %11n 123.45 123.45$+ +tstfmon_n20n32 %11n -123.45 123.45- $ +tstfmon_n20n32 %^=*#5n 123.45 **123.45$+ +tstfmon_n20n32 %^=*#5n -123.45 **123.45- $ +# +tstfmon_n30y20 %n 123.45 123.45+$ +tstfmon_n30y20 %n -123.45 $123.45- +tstfmon_n30y20 %11n 123.45 123.45+$ +tstfmon_n30y20 %11n -123.45 $123.45- +tstfmon_n30y20 %^=*#5n 123.45 **123.45+$ +tstfmon_n30y20 %^=*#5n -123.45 $**123.45- +# +tstfmon_n41n00 %n 123.45 123.45 $+ +tstfmon_n41n00 %n -123.45 (123.45$) +tstfmon_n41n00 %11n 123.45 123.45 $+ +tstfmon_n41n00 %11n -123.45 (123.45$) +tstfmon_n41n00 %^=*#5n 123.45 **123.45 $+ +tstfmon_n41n00 %^=*#5n -123.45 (**123.45$) +# +tstfmon_y01y10 %n 123.45 $ 123.45 +tstfmon_y01y10 %n -123.45 -$123.45 +tstfmon_y01y10 %11n 123.45 $ 123.45 +tstfmon_y01y10 %11n -123.45 -$123.45 +tstfmon_y01y10 %^=*#5n 123.45 $ **123.45 +tstfmon_y01y10 %^=*#5n -123.45 -$**123.45 +# +tstfmon_y02n22 %n 123.45 $123.45 +tstfmon_y02n22 %n -123.45 123.45$ O/D +tstfmon_y02n22 %12n 123.45 $123.45 +tstfmon_y02n22 %12n -123.45 123.45$ O/D +tstfmon_y02n22 %^=*#5n 123.45 $**123.45 +tstfmon_y02n22 %^=*#5n -123.45 **123.45$ O/D +# +tstfmon_y22n42 %n 123.45 $123.45+ +tstfmon_y22n42 %n -123.45 123.45$ - +tstfmon_y22n42 %11n 123.45 $123.45+ +tstfmon_y22n42 %11n -123.45 123.45$ - +tstfmon_y22n42 %^=*#5n 123.45 $**123.45+ +tstfmon_y22n42 %^=*#5n -123.45 **123.45$ - +# +tstfmon_y30y21 %n 123.45 +$123.45 +tstfmon_y30y21 %n -123.45 $ 123.45- +tstfmon_y30y21 %11n 123.45 +$123.45 +tstfmon_y30y21 %11n -123.45 $ 123.45- +tstfmon_y30y21 %^=*#5n 123.45 +$**123.45 +tstfmon_y30y21 %^=*#5n -123.45 $ **123.45- +# +tstfmon_y32n31 %n 123.45 + $123.45 +tstfmon_y32n31 %n -123.45 123.45 -$ +tstfmon_y32n31 %11n 123.45 + $123.45 +tstfmon_y32n31 %11n -123.45 123.45 -$ +tstfmon_y32n31 %^=*#5n 123.45 + $**123.45 +tstfmon_y32n31 %^=*#5n -123.45 **123.45 -$ +# +tstfmon_y40y00 %n 123.45 $+123.45 +tstfmon_y40y00 %n -123.45 ($123.45) +tstfmon_y40y00 %11n 123.45 $+123.45 +tstfmon_y40y00 %11n -123.45 ($123.45) +tstfmon_y40y00 %^=*#5n 123.45 $+**123.45 +tstfmon_y40y00 %^=*#5n -123.45 ($**123.45) +# +tstfmon_y42n21 %n 123.45 $ +123.45 +tstfmon_y42n21 %n -123.45 123.45 $- +tstfmon_y42n21 %11n 123.45 $ +123.45 +tstfmon_y42n21 %11n -123.45 123.45 $- +tstfmon_y42n21 %^=*#5n 123.45 $ +**123.45 +tstfmon_y42n21 %^=*#5n -123.45 **123.45 $- diff --git a/localedata/tst-fmon.sh b/localedata/tst-fmon.sh index a98a3bfce0..a1c9ad5d3c 100755 --- a/localedata/tst-fmon.sh +++ b/localedata/tst-fmon.sh @@ -19,13 +19,17 @@ # not, write to the Free Software Foundation, Inc., # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +DEBUG=0 +case $1 in +-d) DEBUG=1; shift ;; +esac + common_objpfx=$1 datafile=$2 -DEBUG=0 here=`pwd` -lang=`sed -e '/^#/d' -e '/^$/d' -e '/^C /d' -e 's/^\([^ ]*\).*/\1/' $datafile | sort | uniq` +lang=`sed -e '/^#/d' -e '/^$/d' -e '/^C /d' -e '/^tstfmon/d' -e 's/^\([^ ]*\).*/\1/' $datafile | sort | uniq` # Generate data files. for l in $lang; do @@ -37,6 +41,14 @@ for l in $lang; do ${common_objpfx}locale/localedef \ --quiet -i $cn -f $fn ${common_objpfx}localedata/$cns done +for cns in `cd ./tst-fmon-locales && ls tstfmon_*`; do + cn=tst-fmon-locales/$cns + fn=charmaps/ISO-8859-1 + I18NPATH=. \ + ${common_objpfx}elf/ld.so --library-path $common_objpfx \ + ${common_objpfx}locale/localedef \ + --quiet -i $cn -f $fn ${common_objpfx}localedata/$cns +done # Run the tests. IFS=" " # This is a TAB @@ -54,7 +66,9 @@ while read locale format value expect; do else echo "Locale: \"${locale}\" Format: \"${format}\"" \ "Value: \"${value}\" Expect: \"${expect}\" failed" - exit 1 + if [ $DEBUG -eq 0 ]; then + exit 1 + fi fi fi done < $datafile diff --git a/stdlib/strfmon.c b/stdlib/strfmon.c index b0c9375247..319736dc82 100644 --- a/stdlib/strfmon.c +++ b/stdlib/strfmon.c @@ -388,6 +388,24 @@ __strfmon_l (char *s, size_t maxsize, __locale_t loc, const char *format, ...) if (other_sign_posn == CHAR_MAX) other_sign_posn = 1; + /* Check for degenerate cases */ + if (sep_by_space == 2) + { + if (sign_posn == 0 || + (sign_posn == 1 && !cs_precedes) || + (sign_posn == 2 && cs_precedes)) + /* sign and symbol are not adjacent, so no separator */ + sep_by_space = 0; + } + if (other_sep_by_space == 2) + { + if (other_sign_posn == 0 || + (other_sign_posn == 1 && !other_cs_precedes) || + (other_sign_posn == 2 && other_cs_precedes)) + /* sign and symbol are not adjacent, so no separator */ + other_sep_by_space = 0; + } + /* Set the left precision and padding needed for alignment */ if (left_prec == -1) { @@ -399,54 +417,48 @@ __strfmon_l (char *s, size_t maxsize, __locale_t loc, const char *format, ...) /* Set left_pad to number of spaces needed to align positive and negative formats */ - int sign_precedes = 0; - int other_sign_precedes = 0; + int left_bytes = 0; + int other_left_bytes = 0; - if (sign_posn == 0 && !is_negative) - left_pad = 1; - else - left_pad = 0; - - if (!cs_precedes && other_cs_precedes) + /* Work out number of bytes for currency string and separator + preceding the value */ + if (cs_precedes) { - /* The other format has currency symbol preceding value, - but this format doesn't, so pad by the relevant amount */ - left_pad += strlen (currency_symbol); - if (other_sep_by_space != 0) - ++left_pad; + left_bytes += strlen (currency_symbol); + if (sep_by_space != 0) + ++left_bytes; } - /* Work out for each format whether a sign (or left parenthesis) - precedes the value */ - if (sign_posn == 0 || sign_posn == 1) - sign_precedes = 1; - if (other_sign_posn == 0 || other_sign_posn == 1) - other_sign_precedes = 1; - if (cs_precedes && (sign_posn == 3 || sign_posn == 4)) - sign_precedes = 1; - if (other_cs_precedes - && (other_sign_posn == 3 || other_sign_posn == 4)) - other_sign_precedes = 1; - - if (!sign_precedes && other_sign_precedes) + if (other_cs_precedes) { - /* The other format has a sign (or left parenthesis) preceding - the value, but this format doesn't */ - if (other_sign_posn == 0) - ++left_pad; - else - left_pad += strlen (other_sign_string); - } - else if (sign_precedes && other_sign_precedes) - { - /* Both formats have a sign (or left parenthesis) preceding - the value, so compare their lengths */ - int len_diff = - ((other_sign_posn == 0 ? 1 : (int) strlen (other_sign_string)) - - (sign_posn == 0 ? 1 : (int) strlen (sign_string))); - if (len_diff > 0) - left_pad += len_diff; + other_left_bytes += strlen (currency_symbol); + if (other_sep_by_space != 0) + ++other_left_bytes; } + + /* Work out number of bytes for the sign (or left parenthesis) + preceding the value */ + if (sign_posn == 0 && is_negative) + ++left_bytes; + else if (sign_posn == 1) + left_bytes += strlen (sign_string); + else if (cs_precedes && (sign_posn == 3 || sign_posn == 4)) + left_bytes += strlen (sign_string); + + if (other_sign_posn == 0 && !is_negative) + ++other_left_bytes; + else if (other_sign_posn == 1) + other_left_bytes += strlen (other_sign_string); + else if (other_cs_precedes && + (other_sign_posn == 3 || other_sign_posn == 4)) + other_left_bytes += strlen (other_sign_string); + + /* Compare the number of bytes preceding the value for + each format, and set the padding accordingly */ + if (other_left_bytes > left_bytes) + left_pad = other_left_bytes - left_bytes; + else + left_pad = 0; } /* Perhaps we'll someday make these things configurable so @@ -481,6 +493,10 @@ __strfmon_l (char *s, size_t maxsize, __locale_t loc, const char *format, ...) if (sep_by_space == 2) out_char (' '); out_string (sign_string); + if (sep_by_space == 1) + /* POSIX.2 and SUS are not clear on this case, but C99 + says a space follows the adjacent-symbol-and-sign */ + out_char (' '); } else if (sep_by_space == 1) @@ -560,7 +576,9 @@ __strfmon_l (char *s, size_t maxsize, __locale_t loc, const char *format, ...) if (print_curr_symbol) { if ((sign_posn == 3 && sep_by_space == 2) + || (sign_posn == 4 && sep_by_space == 1) || (sign_posn == 2 && sep_by_space == 1) + || (sign_posn == 1 && sep_by_space == 1) || (sign_posn == 0 && sep_by_space == 1)) out_char (' '); out_string (currency_symbol); |