Skip to content

Commit 7422026

Browse files
committed
ICU-23144 Prevent exponential parsing time in RBNF. Sync ICU4C and ICU4J RBNF. Fix roundtrip parsing of rules that use 2 of the same substitution type. Fix bad parsing of rules with delimiters that can be a part of a number.
1 parent 9407fad commit 7422026

File tree

30 files changed

+446
-628
lines changed

30 files changed

+446
-628
lines changed

icu4c/source/data/rbnf/af.txt

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,9 @@
44
af{
55
RBNFRules{
66
OrdinalRules{
7-
"%%digits-ordinal-indicator:",
8-
"0: ste;",
9-
"1: ste;",
10-
"2: de;",
11-
"20: ste;",
12-
"100: >>;",
137
"%digits-ordinal:",
148
"-x: \u2212>>;",
15-
"0: =#,##0==%%digits-ordinal-indicator=;",
9+
"0: =#,##0=$(ordinal,few{de}other{ste})$;",
1610
}
1711
SpelloutRules{
1812
"%%2d-year:",

icu4c/source/data/rbnf/az.txt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@
44
az{
55
RBNFRules{
66
OrdinalRules{
7-
"%%digits-ordinal-indicator:",
8-
"0: ''inci;",
97
"%digits-ordinal:",
108
"-x: \u2212>>;",
11-
"0: =#,##0==%%digits-ordinal-indicator=;",
9+
"0: =#,##0='inci;",
1210
}
1311
SpelloutRules{
1412
"%spellout-numbering-year:",

icu4c/source/data/rbnf/bg.txt

Lines changed: 3 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -4,54 +4,15 @@
44
bg{
55
RBNFRules{
66
OrdinalRules{
7-
"%%digits-ordinal-masculine-larger-suffix:",
8-
"0: \u0442\u0435\u043D;",
9-
"1: >%%digits-ordinal-masculine-suffix>;",
10-
"100: >>;",
11-
"%%digits-ordinal-masculine-suffix:",
12-
"0: \u0438;",
13-
"1: \u0432\u0438;",
14-
"2: \u0440\u0438;",
15-
"3: \u0442\u0438;",
16-
"5: \u0438;",
17-
"20: >>;",
18-
"100: >%%digits-ordinal-masculine-larger-suffix>;",
19-
"1000: >>;",
207
"%digits-ordinal-masculine:",
218
"-x: \u2212>>;",
22-
"0: =#,##0=-=%%digits-ordinal-masculine-suffix=;",
23-
"%%digits-ordinal-feminine-larger-suffix:",
24-
"0: \u0442\u043D\u0430;",
25-
"1: >%%digits-ordinal-feminine-suffix>;",
26-
"100: >>;",
27-
"%%digits-ordinal-feminine-suffix:",
28-
"0: \u0430;",
29-
"1: \u0432\u0430;",
30-
"2: \u0440\u0430;",
31-
"3: \u0442\u0430;",
32-
"5: \u0430;",
33-
"20: >>;",
34-
"100: >%%digits-ordinal-feminine-larger-suffix>;",
35-
"1000: >>;",
9+
"0: =#,##0=-$(ordinal,zero{\u0442\u0435\u043D}one{\u0432\u0438}two{\u0440\u0438}few{\u0442\u0438}many{\u043C\u0438}other{\u0438})$;",
3610
"%digits-ordinal-feminine:",
3711
"-x: \u2212>>;",
38-
"0: =#,##0=-=%%digits-ordinal-feminine-suffix=;",
39-
"%%digits-ordinal-neuter-larger-suffix:",
40-
"0: \u0442\u043D\u043E;",
41-
"1: >%%digits-ordinal-neuter-suffix>;",
42-
"100: >>;",
43-
"%%digits-ordinal-neuter-suffix:",
44-
"0: o;",
45-
"1: \u0432o;",
46-
"2: \u0440o;",
47-
"3: \u0442o;",
48-
"5: o;",
49-
"20: >>;",
50-
"100: >%%digits-ordinal-neuter-larger-suffix>;",
51-
"1000: >>;",
12+
"0: =#,##0=-$(ordinal,zero{\u0442\u043D\u0430}one{\u0432\u0430}two{\u0440\u0430}few{\u0442\u0430}many{\u043C\u0430}other{\u0430})$;",
5213
"%digits-ordinal-neuter:",
5314
"-x: \u2212>>;",
54-
"0: =#,##0=-=%%digits-ordinal-neuter-suffix=;",
15+
"0: =#,##0=-$(ordinal,zero{\u0442\u043D\u043E}one{\u0432\u043E}two{\u0440\u043E}few{\u0442\u043E}many{\u043C\u043E}other{\u043E})$;",
5516
"%digits-ordinal:",
5617
"0: =%digits-ordinal-masculine=;",
5718
}

icu4c/source/data/rbnf/es.txt

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,9 @@
44
es{
55
RBNFRules{
66
OrdinalRules{
7-
"%%dord-mascabbrev:",
8-
"0: \u00BA;",
9-
"1: \u1D49\u02B3;",
10-
"2: \u00BA;",
11-
"3: \u1D49\u02B3;",
12-
"4: \u00BA;",
13-
"20: >>;",
14-
"100: >>;",
157
"%digits-ordinal-masculine-adjective:",
168
"-x: \u2212>>;",
17-
"0: =#,##0=.=%%dord-mascabbrev=;",
9+
"0: =#,##0=.$(ordinal,one{\u1D49\u02B3}other{\u00BA})$;",
1810
"%digits-ordinal-masculine:",
1911
"-x: \u2212>>;",
2012
"0: =#,##0=.\u00BA;",

icu4c/source/data/rbnf/es_419.txt

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,9 @@
44
es_419{
55
RBNFRules{
66
OrdinalRules{
7-
"%%dord-mascabbrev:",
8-
"0: \u00BA;",
9-
"1: \u1D49\u02B3;",
10-
"2: \u00BA;",
11-
"3: \u1D49\u02B3;",
12-
"4: \u00BA;",
13-
"20: >>;",
14-
"100: >>;",
157
"%digits-ordinal-masculine-adjective:",
168
"-x: \u2212>>;",
17-
"0: =#,##0==%%dord-mascabbrev=.;",
9+
"0: =#,##0=.$(ordinal,one{\u1D49\u02B3}other{\u00BA})$;",
1810
"%digits-ordinal-masculine:",
1911
"-x: \u2212>>;",
2012
"0: =#,##0=\u00BA.;",

icu4c/source/data/rbnf/ga.txt

Lines changed: 55 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -53,31 +53,10 @@ ga{
5353
SpelloutRules{
5454
"%%lenient-parse:",
5555
"& ' ' , ',' ;",
56-
"%%2d-year:",
57-
"0: agus =%spellout-numbering=;",
58-
"10: =%%spellout-numbering-no-a=;",
5956
"%spellout-numbering-year:",
6057
"-x: m\u00EDneas >>;",
6158
"x.x: =0.0=;",
6259
"0: =%spellout-numbering=;",
63-
"1000/100: <%%spellout-numbering-no-a< >%%2d-year>;",
64-
"10000: =%spellout-numbering=;",
65-
"%%spellout-numbering-no-a:",
66-
"0: n\u00E1id;",
67-
"1: aon;",
68-
"2: d\u00F3;",
69-
"3: tr\u00ED;",
70-
"4: ceathair;",
71-
"5: c\u00FAig;",
72-
"6: s\u00E9;",
73-
"7: seacht;",
74-
"8: ocht;",
75-
"9: naoi;",
76-
"10: deich;",
77-
"11: >> d\u00E9ag;",
78-
"12: >> dh\u00E9ag;",
79-
"13: >> d\u00E9ag;",
80-
"20: =%spellout-numbering=;",
8160
"%spellout-numbering:",
8261
"-x: m\u00EDneas >>;",
8362
"x.x: << pointe >>;",
@@ -92,9 +71,7 @@ ga{
9271
"8: a hocht;",
9372
"9: a naoi;",
9473
"10: a deich;",
95-
"11: >> d\u00E9ag;",
96-
"12: >> dh\u00E9ag;",
97-
"13: >> d\u00E9ag;",
74+
"11: >> $(cardinal,two{dh\u00E9ag}other{d\u00E9ag})$;",
9875
"20: fiche[ >>];",
9976
"30: tr\u00EDocha[ >>];",
10077
"40: daichead[ >>];",
@@ -103,27 +80,33 @@ ga{
10380
"70: seacht\u00F3[ >>];",
10481
"80: ocht\u00F3[ >>];",
10582
"90: n\u00F3cha[ >>];",
106-
"100: <%%hundreds<[>%%is-number>];",
107-
"1000: <%%thousands<[, >%spellout-numbering>];",
108-
"1000000: <%%millions<[, >%spellout-numbering>];",
109-
"1000000000: <%%billions<[, >%spellout-numbering>];",
110-
"1000000000000: <%%trillions<[, >%spellout-numbering>];",
111-
"1000000000000000: <%%quadrillions<[, >%spellout-numbering>];",
83+
"100: c\u00E9ad[ is >>];",
84+
"200: <%%spellout-cardinal-attributive< $(cardinal,many{gc\u00E9ad}other{ch\u00E9ad})$[ is >>];",
85+
"1000: <%%thousands<[ >>];",
86+
"1000000: <%%millions<[ >>];",
87+
"1000000000: <%%billions<[ >>];",
88+
"1000000000000: <%%trillions<[ >>];",
89+
"1000000000000000: <%%quadrillions<[ >>];",
11290
"1000000000000000000: =#,##0=;",
113-
"%%is-number:",
114-
"0: ' is =%spellout-numbering=;",
115-
"1: ' =%spellout-numbering=;",
116-
"%%is-numberp:",
117-
"0: ' is =%%numberp=;",
118-
"1: ' =%%numberp=;",
119-
"%%numberp:",
120-
"0: =%%spellout-cardinal-prefixpart=;",
121-
"12: d\u00F3 dh\u00E9ag;",
122-
"13: =%%spellout-cardinal-prefixpart= d\u00E9ag;",
123-
"20: =%%spellout-cardinal-prefixpart=;",
12491
"%spellout-cardinal:",
125-
"0: =%spellout-numbering=;",
126-
"%%spellout-cardinal-prefixpart:",
92+
"-x: m\u00EDneas >>;",
93+
"x.x: << pointe >>;",
94+
"0: n\u00E1id;",
95+
"1: aon;",
96+
"2: d\u00F3;",
97+
"3: tr\u00ED;",
98+
"4: ceathair;",
99+
"5: c\u00FAig;",
100+
"6: s\u00E9;",
101+
"7: seacht;",
102+
"8: ocht;",
103+
"9: naoi;",
104+
"10: deich;",
105+
"11: >> $(cardinal,two{dh\u00E9ag}other{d\u00E9ag})$;",
106+
"20: =%spellout-numbering=;",
107+
"%%is-number-attributive:",
108+
"0: [ | is ]=%%spellout-cardinal-attributive=;",
109+
"%%spellout-cardinal-attributive:",
127110
"0: n\u00E1id;",
128111
"1: aon;",
129112
"2: dh\u00E1;",
@@ -135,7 +118,7 @@ ga{
135118
"8: ocht;",
136119
"9: naoi;",
137120
"10: deich;",
138-
"11: >>;",
121+
"11: >> $(cardinal,two{dh\u00E9ag}other{d\u00E9ag})$;",
139122
"20: fiche[ is >>];",
140123
"30: tr\u00EDocha[ is >>];",
141124
"40: daichead[ is >>];",
@@ -144,103 +127,44 @@ ga{
144127
"70: seacht\u00F3[ is >>];",
145128
"80: ocht\u00F3[ is >>];",
146129
"90: n\u00F3cha[ is >>];",
147-
"100: <%%hundreds<[>%%is-numberp>];",
148-
"1000: <%%thousands<[, >%%numberp>];",
149-
"1000000: <%%millions<[, >%%numberp>];",
150-
"1000000000: <%%billions<[, >%%numberp>];",
151-
"1000000000000: <%%trillions<[, >%%numberp>];",
152-
"1000000000000000: <%%quadrillions<[, >%%numberp>];",
153-
"1000000000000000000: =#,##0=;",
154-
"%%is:",
155-
"0: ' is;",
156-
"1: ;",
157-
"10: >>;",
158-
"%%hundreds:",
159-
"1: c\u00E9ad;",
160-
"2: dh\u00E1 ch\u00E9ad;",
161-
"3: tr\u00ED ch\u00E9ad;",
162-
"4: ceithre ch\u00E9ad;",
163-
"5: c\u00FAig ch\u00E9ad;",
164-
"6: s\u00E9 ch\u00E9ad;",
165-
"7: seacht gc\u00E9ad;",
166-
"8: ocht gc\u00E9ad;",
167-
"9: naoi gc\u00E9ad;",
130+
"100: c\u00E9ad[ is >>];",
131+
"200: <%%spellout-cardinal-attributive< $(cardinal,many{gc\u00E9ad}other{ch\u00E9ad})$[>%%is-number-attributive>];",
132+
"1000: =%spellout-numbering=;",
168133
"%%thousands:",
169134
"1: m\u00EDle;",
170-
"2: =%%spellout-cardinal-prefixpart= =%%thousandp=;",
171-
"100: <%%hundreds<>%%is-thousands>;",
172-
"%%thousandp:",
173-
"2: =%%thousand=;",
174-
"11: =%%thousand= dh\u00E9ag;",
175-
"20: =%%thousand=;",
176-
"%%thousand:",
177-
"0: m\u00EDle;",
178-
"1: mh\u00EDle;",
179-
"7: m\u00EDle;",
180-
"11: >>;",
181-
"%%is-thousands:",
182-
"0: ' =%%thousand=;",
183-
"1: ' is =%%spellout-cardinal-prefixpart= =%%thousand=;",
184-
"11: ' is =%%thousands=;",
185-
"20: =%%is= =%%thousands=;",
135+
"2: =%%spellout-cardinal-attributive= $(cardinal,many{m\u00EDle}other{mh\u00EDle})$;",
136+
"11: >%%spellout-cardinal-attributive> mh\u00EDle dh\u00E9ag;",
137+
"20: =%%spellout-cardinal-attributive= mh\u00EDle;",
138+
"100: c\u00E9ad [>>|m\u00EDle];",
139+
"200: <%%spellout-cardinal-attributive< $(cardinal,many{gc\u00E9ad}other{ch\u00E9ad})$ [>>|m\u00EDle];",
186140
"%%millions:",
187141
"1: milli\u00FAn;",
188-
"2: =%%spellout-cardinal-prefixpart= =%%millionsp=;",
189-
"100: <%%hundreds<>%%is-millions>;",
190-
"%%millionsp:",
191-
"2: =%%million=;",
192-
"11: =%%million= d\u00E9ag;",
193-
"20: =%%million=;",
194-
"%%million:",
195-
"0: milli\u00FAn;",
196-
"1: mhilli\u00FAn;",
197-
"7: milli\u00FAn;",
198-
"11: >>;",
199-
"%%is-millions:",
200-
"0: ' =%%million=;",
201-
"1: ' is =%%spellout-cardinal-prefixpart= =%%million=;",
202-
"11: ' is =%%millions=;",
203-
"20: =%%is= =%%millions=;",
142+
"2: =%%spellout-cardinal-attributive= $(cardinal,many{milli\u00FAn}other{mhilli\u00FAn})$;",
143+
"11: >%%spellout-cardinal-attributive> mhilli\u00FAn dh\u00E9ag;",
144+
"20: =%%spellout-cardinal-attributive= mhilli\u00FAn;",
145+
"100: c\u00E9ad [>>|milli\u00FAn];",
146+
"200: <%%spellout-cardinal-attributive< $(cardinal,many{gc\u00E9ad}other{ch\u00E9ad})$ [>>|milli\u00FAn];",
204147
"%%billions:",
205148
"1: billi\u00FAn;",
206-
"2: =%%spellout-cardinal-prefixpart= billi\u00FAn;",
207-
"11: =%%spellout-cardinal-prefixpart= billi\u00FAn d\u00E9ag;",
208-
"20: =%%spellout-cardinal-prefixpart= billi\u00FAn;",
209-
"100: <%%hundreds<>%%is-billions>;",
210-
"%%is-billions:",
211-
"0: ' billi\u00FAn;",
212-
"1: ' is =%%spellout-cardinal-prefixpart= billi\u00FAn;",
213-
"11: ' is =%%billions=;",
214-
"20: =%%is= =%%billions=;",
149+
"2: =%%spellout-cardinal-attributive= billi\u00FAn;",
150+
"11: >%%spellout-cardinal-attributive> billi\u00FAn d\u00E9ag;",
151+
"20: =%%spellout-cardinal-attributive= billi\u00FAn;",
152+
"100: c\u00E9ad [>>|billi\u00FAn];",
153+
"200: <%%spellout-cardinal-attributive< $(cardinal,many{gc\u00E9ad}other{ch\u00E9ad})$ [>>|billi\u00FAn];",
215154
"%%trillions:",
216155
"1: thrilli\u00FAn;",
217-
"2: =%%spellout-cardinal-prefixpart= =%%trillionsp=;",
218-
"100: <%%hundreds<>%%is-trillions>;",
219-
"%%trillionsp:",
220-
"2: =%%trillion=;",
221-
"11: =%%trillion= d\u00E9ag;",
222-
"20: =%%trillion=;",
223-
"%%trillion:",
224-
"0: dtrilli\u00FAn;",
225-
"1: thrilli\u00FAn;",
226-
"7: dtrilli\u00FAn;",
227-
"11: >>;",
228-
"%%is-trillions:",
229-
"0: ' =%%trillion=;",
230-
"1: ' is =%%spellout-cardinal-prefixpart= =%%trillion=;",
231-
"11: ' is =%%trillions=;",
232-
"20: =%%is= =%%trillions=;",
156+
"2: =%%spellout-cardinal-attributive= $(cardinal,many{dtrilli\u00FAn}other{thrilli\u00FAn})$;",
157+
"11: >%%spellout-cardinal-attributive> thrilli\u00FAn dh\u00E9ag;",
158+
"20: =%%spellout-cardinal-attributive= thrilli\u00FAn;",
159+
"100: c\u00E9ad [>>|thrilli\u00FAn];",
160+
"200: <%%spellout-cardinal-attributive< $(cardinal,many{gc\u00E9ad}other{ch\u00E9ad})$ [>>|thrilli\u00FAn];",
233161
"%%quadrillions:",
234162
"1: quadrilli\u00FAn;",
235-
"2: =%%spellout-cardinal-prefixpart= quadrilli\u00FAn;",
236-
"11: =%%spellout-cardinal-prefixpart= quadrilli\u00FAn d\u00E9ag;",
237-
"20: =%%spellout-cardinal-prefixpart= quadrilli\u00FAn;",
238-
"100: <%%hundreds<>%%is-quadrillions>;",
239-
"%%is-quadrillions:",
240-
"0: ' quadrilli\u00FAn;",
241-
"1: ' is =%%spellout-cardinal-prefixpart= quadrilli\u00FAn;",
242-
"11: ' is =%%quadrillions=;",
243-
"20: =%%is= =%%quadrillions=;",
163+
"2: =%%spellout-cardinal-attributive= quadrilli\u00FAn;",
164+
"11: >%%spellout-cardinal-attributive> quadrilli\u00FAn d\u00E9ag;",
165+
"20: =%%spellout-cardinal-attributive= quadrilli\u00FAn;",
166+
"100: c\u00E9ad [>>|quadrilli\u00FAn];",
167+
"200: <%%spellout-cardinal-attributive< $(cardinal,many{gc\u00E9ad}other{ch\u00E9ad})$ [>>|quadrilli\u00FAn];",
244168
}
245169
}
246170
}

icu4c/source/data/rbnf/it.txt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,12 @@
44
it{
55
RBNFRules{
66
OrdinalRules{
7-
"%%dord-mascabbrev:",
8-
"0: \u00BA;",
97
"%digits-ordinal-masculine:",
108
"-x: \u2212>>;",
11-
"0: =#,##0==%%dord-mascabbrev=;",
12-
"%%dord-femabbrev:",
13-
"0: \u00AA;",
9+
"0: =#,##0=\u00BA;",
1410
"%digits-ordinal-feminine:",
1511
"-x: \u2212>>;",
16-
"0: =#,##0==%%dord-femabbrev=;",
12+
"0: =#,##0=\u00AA;",
1713
"%digits-ordinal:",
1814
"0: =%digits-ordinal-masculine=;",
1915
}

icu4c/source/data/rbnf/ky.txt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@
44
ky{
55
RBNFRules{
66
OrdinalRules{
7-
"%%digits-ordinal-indicator:",
8-
"0: ''\u0438\u043D\u0447\u0438;",
97
"%digits-ordinal:",
108
"-x: \u2212>>;",
11-
"0: =#,##0==%%digits-ordinal-indicator=;",
9+
"0: =#,##0='\u0438\u043D\u0447\u0438;",
1210
}
1311
SpelloutRules{
1412
"%spellout-numbering-year:",

0 commit comments

Comments
 (0)