OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserv
ed. | 4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserv
ed. |
5 * Copyright (C) 2006 Andrew Wellington (proton@wiretapped.net) | 5 * Copyright (C) 2006 Andrew Wellington (proton@wiretapped.net) |
6 * Copyright (C) 2010 Daniel Bates (dbates@intudata.com) | 6 * Copyright (C) 2010 Daniel Bates (dbates@intudata.com) |
7 * | 7 * |
8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 { | 151 { |
152 return toNumeric(number, alphabet, size); | 152 return toNumeric(number, alphabet, size); |
153 } | 153 } |
154 | 154 |
155 template <typename CharacterType, size_t size> | 155 template <typename CharacterType, size_t size> |
156 static inline String toSymbolic(int number, const CharacterType(&alphabet)[size]
) | 156 static inline String toSymbolic(int number, const CharacterType(&alphabet)[size]
) |
157 { | 157 { |
158 return toSymbolic(number, alphabet, size); | 158 return toSymbolic(number, alphabet, size); |
159 } | 159 } |
160 | 160 |
161 static int toHebrewUnder1000(int number, UChar letters[5]) | 161 static void toHebrewUnder1000(int number, Vector<UChar>& letters) |
162 { | 162 { |
163 // FIXME: CSS3 mentions various refinements not implemented here. | 163 // FIXME: CSS3 mentions various refinements not implemented here. |
164 // FIXME: Should take a look at Mozilla's HebrewToText function (in nsBullet
Frame). | 164 // FIXME: Should take a look at Mozilla's HebrewToText function (in nsBullet
Frame). |
165 ASSERT(number >= 0 && number < 1000); | 165 ASSERT(number >= 0 && number < 1000); |
166 int length = 0; | |
167 int fourHundreds = number / 400; | 166 int fourHundreds = number / 400; |
168 for (int i = 0; i < fourHundreds; i++) | 167 for (int i = 0; i < fourHundreds; i++) |
169 letters[length++] = 1511 + 3; | 168 letters.prepend(1511 + 3); |
170 number %= 400; | 169 number %= 400; |
171 if (number / 100) | 170 if (number / 100) |
172 letters[length++] = 1511 + (number / 100) - 1; | 171 letters.prepend(1511 + (number / 100) - 1); |
173 number %= 100; | 172 number %= 100; |
174 if (number == 15 || number == 16) { | 173 if (number == 15 || number == 16) { |
175 letters[length++] = 1487 + 9; | 174 letters.prepend(1487 + 9); |
176 letters[length++] = 1487 + number - 9; | 175 letters.prepend(1487 + number - 9); |
177 } else { | 176 } else { |
178 if (int tens = number / 10) { | 177 if (int tens = number / 10) { |
179 static const UChar hebrewTens[9] = { 1497, 1499, 1500, 1502, 1504, 1
505, 1506, 1508, 1510 }; | 178 static const UChar hebrewTens[9] = { 1497, 1499, 1500, 1502, 1504, 1
505, 1506, 1508, 1510 }; |
180 letters[length++] = hebrewTens[tens - 1]; | 179 letters.prepend(hebrewTens[tens - 1]); |
181 } | 180 } |
182 if (int ones = number % 10) | 181 if (int ones = number % 10) |
183 letters[length++] = 1487 + ones; | 182 letters.prepend(1487 + ones); |
184 } | 183 } |
185 ASSERT(length <= 5); | |
186 return length; | |
187 } | 184 } |
188 | 185 |
189 static String toHebrew(int number) | 186 static String toHebrew(int number) |
190 { | 187 { |
191 // FIXME: CSS3 mentions ways to make this work for much larger numbers. | 188 // FIXME: CSS3 mentions ways to make this work for much larger numbers. |
192 ASSERT(number >= 0 && number <= 999999); | 189 ASSERT(number >= 0 && number <= 999999); |
193 | 190 |
194 if (number == 0) { | 191 if (number == 0) { |
195 static const UChar hebrewZero[3] = { 0x05D0, 0x05E4, 0x05E1 }; | 192 static const UChar hebrewZero[3] = { 0x05E1, 0x05E4, 0x05D0 }; |
196 return String(hebrewZero, 3); | 193 return String(hebrewZero, 3); |
197 } | 194 } |
198 | 195 |
199 const int lettersSize = 11; // big enough for two 5-digit sequences plus a q
uote mark between | 196 Vector<UChar> letters; |
200 UChar letters[lettersSize]; | 197 if (number > 999) { |
201 | 198 toHebrewUnder1000(number / 1000, letters); |
202 int length; | 199 letters.prepend('\''); |
203 if (number < 1000) { | |
204 length = 0; | |
205 } else { | |
206 length = toHebrewUnder1000(number / 1000, letters); | |
207 letters[length++] = '\''; | |
208 number = number % 1000; | 200 number = number % 1000; |
209 } | 201 } |
210 length += toHebrewUnder1000(number, letters + length); | 202 toHebrewUnder1000(number, letters); |
211 | 203 return String(letters); |
212 ASSERT(length <= lettersSize); | |
213 return String(letters, length); | |
214 } | 204 } |
215 | 205 |
216 static int toArmenianUnder10000(int number, bool upper, bool addCircumflex, UCha
r letters[9]) | 206 static int toArmenianUnder10000(int number, bool upper, bool addCircumflex, UCha
r letters[9]) |
217 { | 207 { |
218 ASSERT(number >= 0 && number < 10000); | 208 ASSERT(number >= 0 && number < 10000); |
219 int length = 0; | 209 int length = 0; |
220 | 210 |
221 int lowerOffset = upper ? 0 : 0x0030; | 211 int lowerOffset = upper ? 0 : 0x0030; |
222 | 212 |
223 if (int thousands = number / 1000) { | 213 if (int thousands = number / 1000) { |
(...skipping 733 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
957 return toHebrew(count); | 947 return toHebrew(count); |
958 } | 948 } |
959 | 949 |
960 ASSERT_NOT_REACHED(); | 950 ASSERT_NOT_REACHED(); |
961 return ""; | 951 return ""; |
962 } | 952 } |
963 | 953 |
964 } // namespace ListMarkerText | 954 } // namespace ListMarkerText |
965 | 955 |
966 } // namespace blink | 956 } // namespace blink |
OLD | NEW |